我有这段代码:
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
和 static
关键字来改进语义,但我真的不在乎编译器如何处理它,只是让它工作。
我对 C 标准的理解有误吗?还是我的编译器很烂?这是 MSVC 9.0。
最佳答案
C 需要它。
来自 C 标准:
(C99, 6.7.8p4) "All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals."
请注意,const
限定符并不意味着常量,而是只读的。 const
对象不是 C 中的常量。
静态对象不能由非常量值初始化的原因与静态对象的初始化是“在程序启动之前”这一事实有关(C99,6.2.4p3) .
关于c - 为什么我不能用非文字值初始化静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877051/