static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
[0x3A]
ここの意味は何ですか?私は次のようなステートメントを学んだだけですint a[2] = {1, 2};
回答:
これは、配列のn番目の要素を初期化することを意味します。あなたが与えた例はそれを意味するでしょう:
togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
これらは「指定イニシャライザー」と呼ばれ、実際にはC99標準の一部です。ただし、のない構文=
はそうではありません。そのページから:
これに対する代替構文は、GCC 2.5以降廃止されましたが、GCCは引き続き受け入れます。
[index]
要素値の前に、を付けずに書き込むこと=
です。
GCCのドキュメントによると、これはISOC99に準拠しています。彼らはそれを「指定イニシャライザー」と呼んでいます。
配列インデックスを指定するには、要素値の前に `[index] = 'と記述します。例えば、
int a[6] = { [4] = 29, [2] = 15 };
と同等です
int a[6] = { 0, 0, 15, 0, 29, 0 };
この構文はこれまで見たことがありませんが、-Wallを使用してgcc4.4.5でコンパイルしただけです。正常にコンパイルされ、警告は表示されませんでした。
その例からわかるように、特定の配列要素を初期化して、他の要素はそのままにしておくことができます。
これはC99で導入され、指定イニシャライザーと呼ばれています。
基本的に、配列に特定の値を設定し、残りをデフォルトのままにすることができます。
この特定のケースでは、配列インデックスはキーボードスキャンコードです。0x3a
はキーのセット#1(セクション10.6を参照)のスキャンコードでありCapsLock
、0x45
はでNumLock
あり、0x46はScrollLock
です。
上記の最初のリンクには、次のように記載されています。
int a[6] = { [4] = 29, [2] = 15 };
と同等です:
int a[6] = { 0, 0, 15, 0, 29, 0 };
興味深いことに、リンクに=
は必要であると記載されていますが、ここではそうではないようです。
これは、C99の機能である指定された初期化子の構文に(近い)ものです。
基本的に、たとえば、配列の一部を初期化します。
int aa[4] = { [2] = 3, [1] = 6 };
配列の2番目の値を6に初期化し、3番目の値を3に初期化します。
あなたの場合、配列オフセットはたまたま16進数(0x3a)であり、配列の58番目の要素をCAPSLOCKの値に初期化します。CAPSLOCKの値は、おそらく表示しているコードの上のコードで定義されています。
がないコードのバージョンは=
、gcc固有の拡張子のようです。