この種の構造体定義を含むコードを見ています。最初は、構造体の定義とインスタンス化を同時に行う特殊な方法だと思っていました。しかし、同様のコードをいくつか自分でテストしたところ、このタイプのコードの動作に関する私の予測は間違っていました。このコードが何をするのか、オンラインでこの種のコードの説明を確認できる場所を誰か教えてもらえますか?
struct Error e = { .code = 22,
.msg = 22100 };
これは構造体定義ではなく、指定された初期化子です。code
フィールドを22
に、msg
フィールドを に設定しています22100
。論理的には、次のように書き換えることができます。
struct Error e = {0};
e.code = 22;
e.msg = 22100;
配列でも同様のことができます:
int a[5] = {
[3] = 12,
[4] = 17
};
C99指定のイニシャライザです。
指定初期化子を使用すると、集計メンバーを任意の順序で初期化でき、メンバーを省略することもできます。明示的に指定されていないメンバーは に初期化され0
ます。
たとえば、a
ここで初期化します。
struct bla {int x; int y; int z;};
struct bla a = {.x =1, .z = 1};
以下の C89 初期化と同等です。
struct bla a = {1, 0, 1};
用語に関する注意。これは指定イニシャライザであり、指定イニシャライザではありません。不具合レポートDR#253を参照してください:
「「指定された初期化子」という用語は、インデックスと新機能のセクションに表示されますが、標準では決して言及されていません(標準では、テキストで「指定初期化子」という用語が使用されています)。
これは指定イニシャライザと呼ばれ、構造体のインスタンスを初期化しています。