为什么我不能用非文字值初始化静态变量?

Spi*_*dey 7 c static const

我有这个代码:

int foo(void){
    return 1;
}

int main(void){
    static const int x = foo();

    //do stuff
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个关于使用非const值初始化静态变量的错误.我认为这与const说明符有关,但事实并非如此.我结束了删除const关键字并执行此操作:

int foo(void){
    return 1;
}

int main(void){
    static int x = 0;
    if (x == 0) x = foo();

    //do stuff
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,为什么编译器只能延迟static int x变量的初始化直到它被使用,更重要的是,为什么它不能只是把它放在读写部分,只是强制它不在编译时写入?我想在我的代码中使用constAND static关键字来改进语义,但我并不关心编译器如何处理它,只是让它工作.

我对C标准的理解是错误的吗?或者我的编译器在吸吮?这是MSVC 9.0.

oua*_*uah 8

C需要它.

从C标准:

(C99,6.7.8p4)"具有静态存储持续时间的对象的初始值设定项中的所有表达式都应是常量表达式或字符串文字."

请注意,const限定符并不意味着不变,而是只读.甲const对象不在C的恒定

静态对象无法通过非常量值初始化的原因与静态对象的初始化在"程序启动之前"(C99,6.2.4p3)完成的事实有关.