2

这段代码是否在所有主要的 C 和 C++ 编译器中初始化数组的所有元素?

int arr[100] = {0};
4

2 回答 2

6

在所有编译器中。这是由 C 标准和 C++ 标准保证的。

例如,对于 C,这里是相关段落:

(C99, 6.7.8p21) “如果大括号括起来的列表中的初始化程序少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。”

(C99,6.7.8p10)“如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:[...] 如果它具有算术类型,它被初始化为(正数或无符号)零;[...]"

于 2012-11-08T23:56:55.247 回答
1

如果数组恰好是结构数组,您很快就会遇到问题。哎呀,你甚至不能做一个单一的结构。

这个简单的示例表明,两个主要编译器(gcc 和 msvc)遵循 ouah 的答案中引用的规范(gcc似乎来自其警告,而 msvc 来自其错误消息)。

考虑这个来源,foo.c / foo.cpp:

void foo(void) {
   struct A {
      int i;
      int j;
   };
   struct A single = {0};
}

使用 gcc 和 g++ 编译:

$ gcc -Wall -W -c foo.c
foo.c: In function 'foo':
foo.c:6:14: warning: missing initializer
foo.c:6:14: warning: (near initialization for 'single.j')

$ g++ -Wall -W -c foo.cpp
foo.cpp: In function 'void foo()':
foo.cpp:6:27: warning: missing initializer for member 'foo()::A::j'

对数组给出相同的警告。这个 gcc 只有两年的历史:gcc --version--> gcc (GCC) 4.5.3

{}没有0的普通在 gcc 中可以正常工作,包括数组。而且您始终可以使用-w(小写)进行编译以禁用所有警告。

但是 MSVS 2012与此示例(包括数组)存在相同和相反的问题。

喜欢 {0},并将{}其视为错误

Error C2059: syntax error : '}'
于 2012-11-09T02:47:19.647 回答