簡體   English   中英

方括號在C中的數組初始化中意味着什么?

[英]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中引入的,稱為指定的初始化程序

它基本上允許您在數組中設置特定的值,其余的保留為默認值。

在這種特定情況下,數組索引是鍵盤掃描代碼。 0x3a設置#1 (請參見10.6節)中CapsLock鍵的掃描代碼0x45NumLock ,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 };

將數組的第二個值初始化為6,將第三個值初始化為3。

在您的情況下,數組偏移恰好是十六進制(0x3a),它將數組的第58個元素初始化為CAPSLOCK的值,該值大概在您顯示的代碼上方的代碼中定義。

您代碼中不帶=的版本似乎是gcc特定的擴展名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM