3 回答
TA贡献1895条经验 获得超7个赞
不,通常,您不应该在C中使用const限定对象来创建名称常量。为了在C语言中创建命名常量,您应该使用宏(#define)或枚举。实际上,就您所暗示的意义而言,C语言没有常量。(在这方面,C与C ++明显不同)
在C语言中,常量和常量表达的概念与C ++的定义非常不同。在C中,常数表示文字值,例如123。这是C 中常量的一些示例
123
34.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限定对象为您工作时(即它按您的意愿进行工作)的情况下,由于在范围和类型方面,它确实在许多方面优于宏。在适用的情况下,您可能应该首选此类对象,但是在一般情况下,您必须考虑上述限制。
TA贡献1780条经验 获得超1个赞
常量比define
s 更可取。有几个优点:
类型安全。尽管C是弱类型语言,但是使用C会
define
失去所有类型安全性,这将使编译器为您解决问题。易于调试。您可以通过调试器更改常量的值,而
define
预处理器会在代码中自动将s更改为实际值,这意味着如果要出于测试/调试目的更改值,则需要重新编译。
TA贡献1851条经验 获得超4个赞
也许我一直在错误地使用它们,但是至少在gcc中,不能在case语句中使用常量。
const int A=12;
switch (argc) {
case A:
break;
}
- 3 回答
- 0 关注
- 583 浏览
添加回答
举报