【发布时间】:2017-02-25 01:02:00
【问题描述】:
在 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 限定符意味着程序本身 在声明初始化之后不会修改对象的值。但是内存中对象的值仍然可以被程序本身之外的一些其他实体修改,所以这里我们不保证实际常量的要求。
如果此答案不正确或不完整,请批评。
【问题讨论】:
-
你用的是什么编译器?我刚刚在 GCC 4.8.2 中尝试过,它可以编译
-
@UnholySheep:它将在函数范围内工作,因为它定义了一个 VLA(可变长度数组)。您将无法初始化该数组。它不能在标准 C 的全局范围内工作——VLA 不能在全局(文件)范围内定义。也许 GCC 允许它作为一个扩展,但请注意它是一个扩展。
-
“在 C 中, const 限定符使对象只读” - 不,它没有!只是程序员向编译器保证他不会在其声明的范围内更改该对象。
-
@Olaf:感谢您的更正,我认为您在这里达到了一个基本点
标签: c expression constants compile-time