我有这样的代码:
int foo(void){
return 1;
}
int main(void){
static const int x = foo();
//do stuff
return 0;
}
但是我在初始化一个具有非常常量值的静态变量时遇到了一个错误。我以为这与const说明符有关,但事实并非如此。我放弃了const关键字并这样做:
int foo(void){
return 1;
}
int main(void){
static int x = 0;
if (x == 0) x = foo();
//do stuff
return 0;
}
现在,为什么编译器不能将static int x
变量的初始化延迟到它被使用,更重要的是,为什么不能将它放在读写部分,并强制要求在编译时不写入它?我想在代码中使用const
AND static
关键字来改进语义,但我并不真正关心编译器如何处理这一问题,只是让它发挥作用。
我对C标准的理解是错误的吗?还是我的编译器很烂?这是微软风投9.0。
C需要它。
来自C标准:
(C99,6.7.8p4)"具有静态存储持续时间的对象的初始化器中的所有表达式都应该是常量表达式或字符串文字。"
请注意,const
限定符并不意味着常量,而是只读的。const
对象在C.中不是常量
静态对象不能用非常数值初始化的原因与静态对象的初始化是在程序启动前完成的有关(C99,6.2.4p3)。
这个约束来自C标准的6.7.8/4节,所以它不仅仅是你的编译器:
具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。
原因是与C++标准不同,C sdoe不需要执行环境为预运行初始化提供入口点(当然不是禁止;静态初始化(5.1.2)的方式和时间是未指定)。