GCCとC 99における構造体のラベル式初期化構文の違い

1052 ワード

GCCは早くからラベル式初期化構造体をサポートしており,標準CはC 99以降にサポートされている.両者は文法が異なり,効果は同じである.
例:
struct Student {
    char *name;
    int age;
    float score;
    double money;
};

従来のGCC初期化コード:
struct Student s1 = {
    age: 18,
    money: 100.23,
};

C 99初期化コード:
struct Student s1 = {
    .age = 18,
    .money = 100.23,
};

明示的に初期化されていないメンバー変数の場合、コンパイラは自動的にデフォルト初期化を行います(intタイプのデフォルトは0、float/doubleのデフォルトは0.0、ポインタのデフォルトはNULL).
GCCタグ式初期化構造体の特性がより早く現れたため,C 99はGCCの手法を参考にしたものと推定され,文法的に一定の変更を行っただけである.このような文法の不一致はいくつかの混乱を招く.このような混乱を避けるために、GCCは元の文法を徐々に放棄し、C 99基準を支持している.
Linux 2です.6以降、カーネルソースにはC 99の新式文法が使用されている.