我应该更喜欢常量而不是定义吗?

在C语言中,我是否更喜欢常量而不是定义?最近,我阅读了很多代码,所有示例都大量使用了定义。



江户川乱折腾
浏览 584回答 3
3回答

人到中年有点甜

不,通常,您不应该在C中使用const限定对象来创建名称常量。为了在C语言中创建命名常量,您应该使用宏(#define)或枚举。实际上,就您所暗示的意义而言,C语言没有常量。(在这方面,C与C ++明显不同)在C语言中,常量和常量表达的概念与C ++的定义非常不同。在C中,常数表示文字值,例如123。这是C 中常量的一些示例12334.58'x'C中的常量可用于构建常量表达式。但是,由于任何类型的const限定对象都不是C中的常量,因此无法在常量表达式中使用它们,因此,您不能在需要使用常量表达式的情况下使用const限定对象。例如,以下不是常数const int C = 123; /* C is not a constant!!! */并且由于上述C内容不是常量,因此不能用于在文件范围内声明数组类型typedef int TArray[C]; /* ERROR: constant expression required */不能用作案例标签switch (i) {  case C: ; /* ERROR: constant expression required */}不能用作位域宽度struct S {  int f : C; /* ERROR: constant expression required */};它不能用作具有静态存储持续时间的对象的初始化程序static int i = C; /* ERROR: constant expression required */它不能用作枚举初始化器enum {  E = C /* ERROR: constant expression required */};即它不能在需要常量的任何地方使用。这似乎违反直觉,但这是C语言定义的方式。这就是为什么您#define在使用的代码中看到大量的-s的原因。同样,在C语言中,const限定对象的使用非常有限。它们基本上完全没有用做“常量”,这就是为什么在C语言中,您基本上不得不使用#define或枚举来声明真正的常量。当然,在使用const限定对象为您工作时(即它按您的意愿进行工作)的情况下,由于在范围和类型方面,它确实在许多方面优于宏。在适用的情况下,您可能应该首选此类对象,但是在一般情况下,您必须考虑上述限制。

慕神8447489

常量比defines 更可取。有几个优点:类型安全。尽管C是弱类型语言,但是使用C会define失去所有类型安全性,这将使编译器为您解决问题。易于调试。您可以通过调试器更改常量的值,而define预处理器会在代码中自动将s更改为实际值,这意味着如果要出于测试/调试目的更改值,则需要重新编译。

繁花不似锦

也许我一直在错误地使用它们,但是至少在gcc中,不能在case语句中使用常量。const int A=12;switch (argc) {    case A:    break;}
打开App,查看更多内容
随时随地看视频慕课网APP