[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.20 初期化子のラベル付要素

標準の C では、初期化子の要素は決まった順番で現れることを要求する。 この順番は、配列や構造体の要素が初期化される順番と同じである。

GNU C では、要素を任意の順番で指定することができる。 これには要素毎に、それが適用される配列の添え字や構造体のフィールド名を 指定する。この拡張は、GNU C++ では実装されていない。

配列の添え字を指定するには、要素の値の前に、‘[index]’ か ‘[index] =’ と書く。例えば、

 
int a[6] = { [4] 29, [2] = 15 };

は、

 
int a[6] = { 0, 0, 15, 0, 29, 0 };

と等価である。添え字の値は、初期化される配列が自動変数であっても、 定数式でなければならない。

ある範囲の要素を同じ値で初期化するには、 ‘[first ... last] = value’ と書く。 例えば、以下のように書く。

 
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

この場合、配列の大きさは、最も大きな添え字の値に 1 を加えたものである ことに注意。

構造体初期化子においては、要素の値の前に、初期化するフィールドの名前を ‘fieldname:’ で指定する。例えば、以下の構造体があるとする。

 
struct point { int x, y; };

以下の初期化は

 
struct point p = { y: yvalue, x: xvalue };

次のと等価である。

 
struct point p = { xvalue, yvalue };

同じ意味を持つ別の書き方は ‘.fieldname =’ である。 以下に例を示す。

 
struct point p = { .y = yvalue, .x = xvalue };

また、要素ラベル(コロン形式かピリオド = 形式で)を使って共用体を初期化し、 共用体のどの要素が使われるべきかを指定することができる。 例えば、

 
union foo { int i; double d; };

union foo f = { d: 4 };

は、4 を double に変換し、二番目の要素として共用体に格納する。 対照的に、4 を union foo 型に変換すると、整数 i として 共用体に格納する。何故なら、4 が整数だからである。(See section 共用体型へのキャスト.)

この要素に名前をつける方法と、通常の C の連続する要素を初期化する方法を 組み合わせることができる。初期化子の要素でラベルのないものはそれぞれ、 配列あるいは構造体の次の連続する要素に適用される。例えば、

 
int a[6] = { [1] = v1, v2, [4] = v4 };

は、以下のものと等価である。

 
int a[6] = { 0, v1, v2, 0, v4, 0 };

配列初期化子の要素にラベルを付けるのは、添え字が文字だったり、 enum 型に属する場合に特に便利である。 例えば、以下のように書くことができる。

 
int whitespace[256]
  = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
      ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };

This document was generated using texi2html 1.78.