以下のコードの意味は何ですか? コードは、GCC の回帰テスト スイートからのものです。
static char * name[] = {
[0x80000000] = "bar"
};
以下のコードの意味は何ですか? コードは、GCC の回帰テスト スイートからのものです。
static char * name[] = {
[0x80000000] = "bar"
};
C99 では、割り当てられた値に配列インデックスを指定できます。次に例を示します。
static char * name[] = {
[3] = "bar"
};
と同じです:
static char * name[] = { NULL, NULL, NULL, "bar"};
配列のサイズは 4 です。ideaoneで動作するサンプル コードを確認してください。コード配列のサイズは0x80000001
(16 進数) です。
注: で初期化された未初期化要素0
。
5.20 指定された初期化子:
ISO C99 では、適用する配列インデックスまたは構造フィールド名を指定して、要素を任意の順序で指定できます。GNU C では、これを C89 モードの拡張としても許可しています。この拡張機能は GNU C++ では実装されていません。配列インデックスを指定する
[index] =
には、要素値の前に記述します。例えば、int a[6] = { [4] = 29, [2] = 15 };
と同等です
int a[6] = { 0, 0, 15, 0, 29, 0 };
GNU 拡張では、もう 1 つの興味深い宣言が可能です。
GCC 2.5 以降は廃止されていますが、GCC ではまだ受け入れられている this の代替構文は
[index]
、 no を使用して要素値の前に書き込むこと=
です。要素の範囲を同じ値に初期化するには、次のように記述し
[first ... last] = value
ます。例えば、int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
注:配列の長さは、指定された最大値に 1 を加えた値です。
さらに、要素に名前を付けるこの手法を、連続する要素の通常の C 初期化と組み合わせることができます。指定子を持たない各初期化子要素は、配列または構造体の次の連続する要素に適用されます。例えば:
int a[6] = { [1] = v1, v2, [4] = v4 };
と同等です
int a[6] = { 0, v1, v2, 0, v4, 0 };
配列初期化子の要素のラベル付けは、インデックスが文字であるか、列挙型に属する場合に特に役立ちます。例えば:
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1
};
これは、C99 で導入された指定初期化子と呼ばれ、gcc は拡張機能として GNU89 でもサポートしています。詳細については、こちらを参照してください。
int a[6] = { [4] = 29, [2] = 15 };
と同等です
int a[6] = { 0, 0, 15, 0, 29, 0 };