这段代码是否在所有主要的 C 和 C++ 编译器中初始化数组的所有元素?
int arr[100] = {0};
在所有编译器中。这是由 C 标准和 C++ 标准保证的。
例如,对于 C,这里是相关段落:
(C99, 6.7.8p21) “如果大括号括起来的列表中的初始化程序少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。”
和
(C99,6.7.8p10)“如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:[...] 如果它具有算术类型,它被初始化为(正数或无符号)零;[...]"
如果数组恰好是结构数组,您很快就会遇到问题。哎呀,你甚至不能做一个单一的结构。
这个简单的示例表明,两个主要编译器(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 : '}'