[英]What do square brackets mean in array initialization in C?
static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
[0x3A]
在這里是什么意思? 我只學過類似int a[2] = {1, 2};
語句int a[2] = {1, 2};
這意味着初始化數組的第n個元素。 您給出的示例將意味着:
togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
這些稱為“指定的初始化程序” ,實際上是C99標准的一部分。 但是,沒有=
的語法不是。 從該頁面:
自GCC 2.5起已經過時但GCC仍然接受的對此的另一種語法是在元素值之前寫入
[index]
,而no=
。
根據GCC文檔,這符合ISO C99。 他們將其稱為“指定的初始化器”:
要指定數組索引,請在元素值前寫“ [index] =”。 例如,
int a[6] = { [4] = 29, [2] = 15 };
相當於
int a[6] = { 0, 0, 15, 0, 29, 0 };
我以前從未見過這種語法,但是我只是使用gcc 4.4.5和-Wall對其進行了編譯。 它編譯成功,沒有發出警告。
從該示例可以看到,它允許您初始化特定的數組元素,而其他元素則保持不變。
它(接近) 指定的初始化程序的語法(一種C99功能)。
例如,基本上,它初始化數組的一部分;
int aa[4] = { [2] = 3, [1] = 6 };
將數組的第二個值初始化為6,將第三個值初始化為3。
在您的情況下,數組偏移恰好是十六進制(0x3a),它將數組的第58個元素初始化為CAPSLOCK的值,該值大概在您顯示的代碼上方的代碼中定義。
您代碼中不帶=
的版本似乎是gcc特定的擴展名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.