dis*_*nes 8 c expression constants compile-time
在 C 中,const限定符使对象只读,但不是常量表达式。例如,不可能使用const int变量来确定数组的维度:
const int n = 10;
int arr [n]; /* Compile-time error */
Run Code Online (Sandbox Code Playgroud)
这其中的技术原因是什么?难道编译器在编译时就不可能知道该对象实际上有一个常量值吗?
我不认为我的问题与Can a const variable be used to statements the size of an array in C?完全相同。 因为我不是在问这是否可能(我的问题中明确指出这是不可能的),而是问为什么这是不可能的技术原因。
在下面奥拉夫的评论、这个答案和一些思考之后,我将尝试以这种方式总结和回答我的问题:
在 C 中,const对象不是编译时常量,因为它可能违反这两个要求:
首先,可以const在运行时初始化对象,如下所示:
int i;
scanf ("%d", & i);
const int n = i;
Run Code Online (Sandbox Code Playgroud)
所以这里我们违反了“编译时已知”的要求。
其次,正如Olaf指出的,const限定符意味着程序本身在声明-初始化之后不会修改对象的值。但是内存中对象的值仍然可以被程序本身之外的其他实体修改,因此这里我们不保证实际常量的要求。
如果此答案不正确或不完整,请批评。
这样做的一个技术原因可能是,当初始值设定项不是常量表达式时,这样的声明甚至是有效的,因此这是通过查看初始值设定项推导出来的语义属性。
然后,根据当前的规则,无法在头文件中在文件范围内声明和定义这样的东西。任何对象只能有一个定义,多个对象文件不能链接在一起。
有一些想法可以在 C 的下一版本中改善这种情况。