gcc会自动将静态变量初始化为零吗?

Amj*_*ith 31 c

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

static int idx;
Run Code Online (Sandbox Code Playgroud)

小智 38

是的 - C标准ISO/IEC 9899:1999又名C99(和C++)标准说必须如此.有关确切文字,请参见WG14 N1256第6.7.8节("初始化")中的第10项.

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

static int idx = 0;
Run Code Online (Sandbox Code Playgroud)

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

  • 我不明白为什么会这样.编译器可以轻松忽略显式零初始化. (5认同)
  • @R ..但你真的没有尝试过那样的吗?:)除了sizeof(int)*10000000 <100 megs(原文如此)这一事实之外,你误解了在大多数C编译器上如何编译这样的声明,因为可执行文件大小根本不会增长,影响仅在运行时. (4认同)
  • 实施细节.GCC 4.2和MSVC 7.1似乎对待`static int a;`和`static int a = 0;`等效.我确实记得那些没有的编译器,但我似乎没有足够老的编程器...... (3认同)

小智 5

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

  • double somethingImportant() { static double arr[1024*1024]; ... } 每个成员的显式初始化可能有点困难。如果您有一个标准编译器,它会根据定义进行初始化。如果你不能依赖像你的编译器这样的基本东西,那就换一个编译器,因为你将很难对任何代码进行推理。 (6认同)
  • 这也让未来的开发人员清楚地知道,您需要将该值设为零。 (5认同)