C中数组初始化中的方括号是什么意思?

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] ,其中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中引入的,它被称为指定的初始化程序 。

它基本上允许你在一个数组中设置特定的值,剩下的作为默认值。

在这种特殊情况下,数组索引是键盘扫描代码。 0x3aCapsLock键的set#1 (见第10.6节)中的扫描码 , 0x45NumLock ,0x46是ScrollLock

在上面的第一个链接上,它指出:

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

相当于:

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

有趣的是,尽pipe链接指出=是必要的,但在这里并不是这样。

这是(接近) 指定的初始值设定项 ,C99function的语法。

基本上,它初始化数组的一部分,例如,

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

初始化数组的第二个值为6,第三个为3。

在你的情况下,数组偏移恰好在hex(0x3a),它将数组的第58个元素初始化为CAPSLOCK的值,这大概是在你正在显示的代码上面的代码中定义的。

代码中没有=的版本似乎是gcc特定的扩展。