由于无法使用以下初始化模式创建数组而回到C时,我常常感到困惑...
const int SOME_ARRAY_SIZE = 6;
const int myArray[SOME_ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)
我对这个问题的理解是const运算符不保证常量,而只是断言SOME_ARRAY_SIZE指向的值在运行时不会改变.但是为什么编译器不能假设值在编译时是常量的?它说源代码中有6个...
我认为我对C的基本理解缺少一些核心内容.有人在这里帮助我.:)
[更新]在读了一下C99和可变长度数组之后,我想我理解这一点好一点.我试图创建的是一个可变长度数组 - const不会创建编译时常量,而是创建运行时常量.因此,我正在初始化一个可变长度数组,该数组仅在函数/块范围内的C99中有效.文件范围内的可变长度数组是不可能的,因为编译器无法将固定内存地址分配给无界数组.[/ UPDATE]
好吧,在C++中,语义有点不同.在C++中,您的代码可以正常工作.你必须区分两件事,const和constant expression.如您所述,Const意味着该值是只读的.另一方面,常量表达式意味着该值是已知的编译时间,并且是编译时常量.C中const的语义始终是第一种类型.C中唯一的常量表达式是文字,这就是为什么#define用于这种事情的原因.
但是,在C++中,使用常量表达式初始化的任何const对象本身都是一个常量表达式.
我不知道为什么在C中这是如此,它就是它的方式