在C中,const
限定符使对象成为只读而不是常量表达式。例如,无法使用const int
变量来标注数组:
const int n = 10;
int arr [n]; /* Compile-time error */
这是技术原因?编译时编译器不可能知道对象实际上有一个常量值吗?
我认为我的问题不是Can a const variable be used to declare the size of an array in C?的完全重复 因为我不是在问这是否可能(在我的问题中明确说明不是这样),而是技术原因这是不可能的。
在下面的奥拉夫的评论,this answer以及一些想法后,我会尝试用这种方式总结和回答我的问题:
在C中,const
对象不是 编译时常量 ,因为它可能违反这两个要求:
首先,可以在运行时初始化const
对象,如下所示:
int i;
scanf ("%d", & i);
const int n = i;
所以这里我们违反了“在编译时知道”的要求。
其次,正如Olaf指出的那样,const
限定符意味着程序本身不会在声明初始化之后修改对象的值。但是内存中对象的值仍然可以被程序本身之外的其他实体修改,所以这里我们不保证实际const的要求。
请批评此答案是否不正确或不完整。
答案 0 :(得分:1)
这样做的一个技术原因可能是当初始化程序不是常量表达式时,这样的声明甚至是有效的,因此这是从查看初始化程序推断出的语义属性。
然后,根据当前规则,在文件范围中无法在头文件中声明和定义这样的东西。任何对象只能有一个定义,并且几个目标文件无法链接在一起。
有一些想法可以改善下一版C的情况。