[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
標準の 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.