yohhoyの日記

技術的メモをしていきたい日記

R.I.P. "= {0}"

次期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