このコードは、すべての主要なCおよびC ++コンパイラで配列のすべての要素を初期化しますか?
int arr[100] = {0};
すべてのコンパイラで。これは、C標準およびC++標準によって保証されています。
たとえば、Cの場合、関連する段落は次のとおりです。
(C99、6.7.8p21) "中括弧で囲まれたリストの初期化子が、集合体の要素またはメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルの文字が、配列の場合、アグリゲートの残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。」
と
(C99、6.7.8p10)「自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的保存期間を持つオブジェクトが明示的に初期化されていない場合、次のようになります。[...]算術演算がある場合タイプ、それは(正または符号なし)ゼロに初期化されます; [...] "
配列がたまたま構造体の配列である場合、すぐに問題が発生します。一体、単一の構造体を実行することさえできません。
この簡単な例は、2 つの主要なコンパイラ (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 はわずか 2 年前のものです: gcc --version
--> gcc (GCC) 4.5.3
.
0{}
のないプレーンは、配列を含め、gcc で正常に動作します。また、常に(小文字)でコンパイルして、すべての警告を無効にすることができます。-w
しかし、MSVS 2012 には、この例 (配列を含む) と同じで逆の問題があります。
それは好きで エラーとして{0},
扱います:{}
Error C2059: syntax error : '}'