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

标签 c static constants

我有这段代码:

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 变量的初始化直到它被使用,更重要的是,为什么它不能把它放在读写部分,并强制要求它不是在编译时写入的?我想在我的代码中使用 conststatic 关键字来改进语义,但我真的不在乎编译器如何处理它,只是让它工作。

我对 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/

相关文章:

c - 如何初始化数组?

c - MIPS 汇编 - 字符串 (ASCII) 指令

c - 使用 getpwnam()/getpwuid() 结果的安全方法?

java - 为什么我们应该在 Java 中使用特定类型的 List

c# - 通用静态字段初始化

c++ - 使用 dynamic_cast 转换 const 类

对 const 语法的困惑

检查Linux服务器段错误的原因

c++ - 静态数组常量会影响共享库布局吗?

c# - 为什么我们不能向枚举添加静态方法?