プログラミング言語 C の新機能 Part XXVII: 指定初期化子 (Designated Initializer)
(1999/10/25 [月])
いよいよ、指定初期化子 (Designated Initializer) の登場です。現在の C 言語では構造体や配列をあらかじめ初期化するには、始めの要素からすべて指定して初期化する方法しかありませんでした。その結果として、入力は非常に大変で、かつ見づらくなります。
そこでこの新機能が登場です。この機能を使って書き直すと次のようになります。
非常にすっきり、見やすくなりました。このように、指定初期化子は初期化時に配列の要素やメンバ名を指定することで、わかりやすく初期化を行えるようにするものです。そこでまず、配列の指定初期化子を使う時には、要素を指定して初期化します。例えば、配列の 3 番目の要素を初期化したい時には、 [3] = ..., というように記述します。また構造体や共用体を初期化したい時には、.メンバ名 = ..., のように指定することで初期化を行えます。
#define ERRMES_NOERROR 0 #define ERRMES_FILEREAD 20 #define ERRMES_FILEWRITE 21 const char *errmessage[] = { "no error", NULL, ... 例えばここに 20 個空きがある ... "file read error", "file write error", }; struct largestruct { int size; ... 例えばここにメンバが 10 個位ある ... int cx, cy; } sls = { sizeof(struct largestruct), ... ここに明示的な初期化しなくてもいいメンバが 10 個位ある ... 640, 480, }; |
そこでこの新機能が登場です。この機能を使って書き直すと次のようになります。
#define ERRMES_NOERROR 0 #define ERRMES_FILEREAD 20 #define ERRMES_FILEWRITE 21 const char *errmessage[] = { [0] = "no error", [ERRMES_FILEREAD] = "file read error", [ERRMES_FILEWRITE] = "file write error", }; struct largestruct { int size; ... ここにメンバが 10 個位ある ... int cx, cy; } sls = { sizeof(struct largestruct), .cx = 640, .cy = 480, }; |
非常にすっきり、見やすくなりました。このように、指定初期化子は初期化時に配列の要素やメンバ名を指定することで、わかりやすく初期化を行えるようにするものです。そこでまず、配列の指定初期化子を使う時には、要素を指定して初期化します。例えば、配列の 3 番目の要素を初期化したい時には、 [3] = ..., というように記述します。また構造体や共用体を初期化したい時には、.メンバ名 = ..., のように指定することで初期化を行えます。
by seclan