[英]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.