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中引入的,它被称为指定的初始化程序 。
它基本上允许你在一个数组中设置特定的值,剩下的作为默认值。
在这种特殊情况下,数组索引是键盘扫描代码。 0x3a
是CapsLock
键的set#1 (见第10.6节)中的扫描码 , 0x45
是NumLock
,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特定的扩展。