【发布时间】:2012-03-26 17:46:58
【问题描述】:
我有这个代码:
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 标准的理解是错误的吗?还是我的编译器很烂?它是 MSVC 9.0。
【问题讨论】:
-
main 中的静态变量有什么用?
-
'x' 在您的示例上下文中看起来像一个局部变量。为什么你希望它是静态的?
-
@ValAkkapeddi:通常是因为您不需要/不想为每次调用该函数重新初始化它。
-
对不起,它实际上不在 main 中,我只是将它放在 main 中,以便可以独立编译 sn-p。
-
@tchap:如果对象太大而无法放入堆栈,或者您想重新输入
main,这很有用。 (在 C 中,递归调用main是合法的。)