プログラミング言語Cの次期C2x(C23)言語仕様では、空のブレース{}
を用いた配列・構造体の初期化が許容される。C++では当初からOK。
typedef struct S { int m1, m2; } S; // C17:ill-formed / C2x:OK / C++:OK int arr0[10] = {}; S obj0 = {}; // C:OK / C++:OK int arr1[10] = { 0 }; S obj1 = { 0 };
C17現在では空の初期化子リストは許されず、少なくとも1つの初期化子を記述する(= {0}
)必要あり。対応する初期化子のない配列要素や構造体メンバは値0
で初期化される(→id:yohhoy:20170510)。
仕様上はNGだが初期化= {}
はあまりに多用されるテクニックのため、GCCやClangなどは独自拡張として許容している。MSVCではC17標準通りコンパイルエラーとなる。
gcc 12.1.0/-pedantic指定時の警告メッセージ:
warning: ISO C forbids empty initializer braces [-Wpedantic]
clang 14.0.0/-pedantic指定時の警告メッセージ:
warning: use of GNU empty initializer extension [-Wgnu-empty-initializer]
関連URL