Cでの配列の初期化で角括弧はどういう意味ですか?


85
static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};

[0x3A]ここの意味は何ですか?私は次のようなステートメントを学んだだけですint a[2] = {1, 2};


ほとんどの場合、残りを入力せずに特定の配列エントリを(指定されたインデックスで)初期化できるコンパイラ拡張です。
Alexey Frunze 2012年

回答:


81

これは、配列のn番目の要素を初期化することを意味します。あなたが与えた例はそれを意味するでしょう:

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK

これらは「指定イニシャライザー」と呼ばれ、実際にはC99標準の一部です。ただし、のない構文=はそうではありません。そのページから:

これに対する代替構文は、GCC 2.5以降廃止されましたが、GCCは引き続き受け入れます。[index]要素値の前に、を付けずに書き込むこと=です。


41

GCCのドキュメントによると、これはISOC99に準拠しています。彼らはそれを「指定イニシャライザー」と呼んでいます。

配列インデックスを指定するには、要素値の前に `[index] = 'と記述します。例えば、

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

と同等です

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

この構文はこれまで見たことがありませんが、-Wallを使用してgcc4.4.5でコンパイルしただけです。正常にコンパイルされ、警告は表示されませんでした。

その例からわかるように、特定の配列要素を初期化して、他の要素はそのままにしておくことができます。


15

これはC99で導入され、指定イニシャライザーと呼ばれています

基本的に、配列に特定の値を設定し、残りをデフォルトのままにすることができます。

この特定のケースでは、配列インデックスはキーボードスキャンコードです。0x3aはキーのセット#1(セクション10.6を参照)のスキャンコードでありCapsLock0x45はでNumLockあり、0x46はScrollLockです。

上記の最初のリンクには、次のように記載されています。

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

と同等です:

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

興味深いことに、リンクに=は必要であると記載されていますが、ここではそうではないようです。


13

これは、C99の機能である指定された初期化子の構文に(近い)ものです。

基本的に、たとえば、配列の一部を初期化します。

int aa[4] = { [2] = 3, [1] = 6 };

配列の2番目の値を6に初期化し、3番目の値を3に初期化します。

あなたの場合、配列オフセットはたまたま16進数(0x3a)であり、配列の58番目の要素をCAPSLOCKの値に初期化します。CAPSLOCKの値は、おそらく表示しているコードの上のコードで定義されています。

がないコードのバージョンは=、gcc固有の拡張子のようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.