static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
[0x3A]
這是什麼意思?我只學過如下語句:int a[2] = {1, 2};
方括號在C中的數組初始化中意味着什麼?
static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
[0x3A]
這是什麼意思?我只學過如下語句:int a[2] = {1, 2};
方括號在C中的數組初始化中意味着什麼?
這意味着初始化所述陣列的所述Ñ個元件。你給出的例子將意味着:
togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
這些被稱爲"designated initializers",並且實際上是C99標準的一部分。然而,如果沒有=
語法不。從這個頁面:
一個可選的語法此起已GCC 2.5過時,但仍GCC接受的元素值之前寫
[index]
,沒有=
。
這是在C99中引入的,它被稱爲designated initialiser。
它基本上允許你在一個數組中設置特定的值,剩下的作爲默認值。
在這種特殊情況下,數組索引是鍵盤掃描代碼。 0x3a
是關於CapsLock
密鑰的scan code in set #1(參見第10.6節),0x45
是NumLock
並且0x46是ScrollLock
。
在上面的第一個環節,它指出:
int a[6] = { [4] = 29, [2] = 15 };
等同於:
int a[6] = { 0, 0, 15, 0, 29, 0 };
有趣的是,雖然鏈接指出=
是必要的,是不會出現在這裏就是這種情況。
根據GCC docs這是ISO C99兼容。他們將其稱爲「指定初始值」:
要指定數組索引,請在元素值之前寫入[[index] ='。 例如,
int a[6] = { [4] = 29, [2] = 15 };
相當於
int a[6] = { 0, 0, 15, 0, 29, 0 };
我以前從未見過這種語法,但我只是用gcc 4.4.5編譯它,與-Wall。它編譯成功並沒有提出任何警告。
你可以從這個例子看到,它可以讓你初始化特定數組元素,留下其他不變。
這是(接近)的designated initializers,C99的功能的語法。
基本上,它初始化數組的一部分,例如;
int aa[4] = { [2] = 3, [1] = 6 };
Intializes所述陣列的所述第二值至6,並且所述第三至3
在你的情況陣列偏移正好是在十六進制(0x3a),該初始化的所述58'th元件數組設置爲CAPSLOCK的值,這大概是在您要顯示的代碼上面的代碼中定義的。
在你的代碼版本,而不=
似乎是一個gcc特定的擴展。
最有可能的是,可以讓你初始化數組的具體條目(在給定的指標)編譯器擴展的w/o在剩下的填充。 – 2012-03-24 06:49:24