为什么在C中const对象不是编译时常量表达式?

时间:2016-10-15 18:34:01

标签: c expression const compile-time

在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的要求。

请批评此答案是否不正确或不完整。

1 个答案:

答案 0 :(得分:1)

这样做的一个技术原因可能是当初始化程序不是常量表达式时,这样的声明甚至是有效的,因此这是从查看初始化程序推断出的语义属性。

然后,根据当前规则,在文件范围中无法在头文件中声明和定义这样的东西。任何对象只能有一个定义,并且几个目标文件无法链接在一起。

有一些想法可以改善下一版C的情况。