gcc是否自动将静态变量初始化为零?

gcc是否自动将静态变量初始化为零?

问题描述:

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

static int idx; 

是 - C标准ISO/IEC 9899:1999又名C99(和C++)的标准说,这一定是这样。请参阅WG14 N1256的第6.7.8节(“初始化”)中的第10项准确的文本。

正如其他人所指出的那样,这是很好的做法,总是初始化静态变量:

static int idx = 0; 

之所以这样做,这不是因为一些编译器可能不总是初始化静态变量零(失败的编译器做这样的初始化将会终止,并且不能声称是C或C++编译器),那就是说出你的意思 - 可能是最基本的编程规则。

+1

然后再一次...反对显式初始化静态变量的参数是它扩展了可执行文件的大小,因为它们不再存在于.bss中。 – ephemient 2009-08-18 16:17:29

+4

我不明白为什么应该如此。编译器可以很容易地忽略显式的零初始化。 – 2009-08-18 16:21:46

+3

实现细节。 GCC 4.2和MSVC 7.1确实似乎将'static int a;'和'static int a = 0;'等价处理。我记得编译器没有,但我似乎手头上没有足够的... – ephemient 2009-08-18 18:19:13

虽然标准说是的...良好的做法表明,你应该总是初始化变量。你永远不知道什么时候你改变编译器,或者不得不在另一台机器上编译它,你想尽量减少意外行为的可能性。

+5

而且这也使未来的开发人员清楚,您需要的价值为零。 – Edd 2009-08-18 15:55:49

+0

@Edd,它确实。 – AAA 2009-08-18 15:57:16

+5

double somethingImportant() { static double arr [1024 * 1024]; ... } 每个成员的显式初始化可能有点困难。如果你有一个标准的编译器,它将根据定义进行初始化。如果你不能依赖像编译器那样基本的东西,那么得到另一个编译器是因为你将难以推理任何代码。 – 2009-08-18 16:00:53