2012-03-24 73 views
79
static uint8_t togglecode[256] = { 
    [0x3A] CAPSLOCK, 
    [0x45] NUMLOCK, 
    [0x46] SCROLLLOCK 
}; 

[0x3A]這是什麼意思?我只學過如下語句:int a[2] = {1, 2};方括號在C中的數組初始化中意味着什麼?

+0

最有可能的是,可以讓你初始化數組的具體條目(在給定的指標)編譯器擴展的w/o在剩下的填充。 – 2012-03-24 06:49:24

回答

77

這意味着初始化所述陣列的所述Ñ個元件。你給出的例子將意味着:

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

這些被稱爲"designated initializers",並且實際上是C99標準的一部分。然而,如果沒有=語法不。從這個頁面:

一個可選的語法此起已GCC 2.5過時,但仍GCC接受的元素值之前寫[index],沒有=

15

這是在C99中引入的,它被稱爲designated initialiser

它基本上允許你在一個數組中設置特定的值,剩下的作爲默認值。

在這種特殊情況下,數組索引是鍵盤掃描代碼。 0x3a是關於CapsLock密鑰的scan code in set #1(參見第10.6節),0x45NumLock並且0x46是ScrollLock

在上面的第一個環節,它指出:

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

等同於:

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

有趣的是,雖然鏈接指出=是必要的,是不會出現在這裏就是這種情況。

39

根據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。它編譯成功並沒有提出任何警告。

你可以從這個例子看到,它可以讓你初始化特定數組元素,留下其他不變。

13

這是(接近)的designated initializers,C99的功能的語法。

基本上,它初始化數組的一部分,例如;

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

Intializes所述陣列的所述第二值至6,並且所述第三至3

在你的情況陣列偏移正好是在十六進制(0x3a),該初始化的所述58'th元件數組設置爲CAPSLOCK的值,這大概是在您要顯示的代碼上面的代碼中定義的。

在你的代碼版本,而不=似乎是一個gcc特定的擴展。

相關問題