【问题标题】:Does gcc automatically initialize static variables to zero?gcc 会自动将静态变量初始化为零吗?
【发布时间】:2009-08-18 15:50:45
【问题描述】:

我有一个在函数中声明但未初始化的静态变量。这个变量会自动初始化为零吗?

static int idx;

【问题讨论】:

    标签: c


    【解决方案1】:

    是的 - C 标准 ISO/IEC 9899:1999 又名 C99(和 C++)标准说必须如此。具体内容请参见WG14 N1256 的第 6.7.8 节(“初始化”)中的第 10 项。

    正如其他人所指出的,最好始终初始化静态变量:

    static int idx = 0;
    

    这样做的原因并不是因为某些编译器可能并不总是将静态变量初始化为零(任何未能进行此类初始化的编译器都会被彻底破坏,并且不能声称是 C 或 C++ 编译器),而是说出你的意思——可能是最基本的编程规则。

    【讨论】:

    • 然后……反对显式零初始化静态变量的论点是它扩展了可执行文件的大小,因为它们不再存在于 .bss 中。
    • 我不明白为什么会这样。编译器可以很容易地忽略显式零初始化。
    • 实施细节。 GCC 4.2 和 MSVC 7.1 似乎确实同等对待 static int a;static int a = 0;。我确实记得没有编译器,但我手头上似乎没有足够老的编译器......
    • @R.. 但你从未真正尝试过,是吗? :) 除了 sizeof(int) * 10000000
    【解决方案2】:

    虽然标准说是...良好的做法表明您应该始终初始化变量。您永远不知道何时更改编译器,或者必须在另一台机器上编译它,您希望最大限度地减少任何意外行为的可能性。

    【讨论】:

    • 而且它也让未来的开发者清楚你需要将值设为零。
    • double somethingImportant() { static double arr[1024*1024]; ... } 每个成员的显式初始化可能有点困难。如果您有一个标准编译器,它会按定义进行初始化。如果您不能依赖于编译器上的基本功能,请使用另一个编译器,因为您将很难对任何代码进行推理。
    • 是的,没有。总是初始化的一些看似合理的原因可能是为了更加清晰,或者以防变量可能很快变成非静态的,并且您希望避免由于后来的心不在焉而导致的问题。容纳无视标准的蹩脚编译器并不是做任何事情的好理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2010-12-22
    • 2021-06-07
    相关资源
    最近更新 更多