方括号在C中的数组初始化中意味着什么?


85
static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};

有什么意义[0x3A]吗?我只学过像int a[2] = {1, 2};


最有可能的是它是一个编译器扩展,可让您初始化特定的数组条目(在给定的索引下),而无需填充其余的条目。
Alexey Frunze'3

Answers:


81

这意味着初始化数组的第n个元素。您给出的示例将意味着:

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK

这些称为“指定的初始化程序”,实际上是C99标准的一部分。但是,没有的语法=不是。从该页面:

自GCC 2.5起已经过时但GCC仍然接受的替代语法是[index]在元素值之前写入no =


41

根据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对其进行了编译。它编译成功,没有发出警告。

从该示例可以看到,它允许您初始化特定的数组元素,而其他元素则保持不变。


15

这是C99中引入的,称为指定的初始化程序

它基本上允许您在数组中设置特定的值,其余的保留为默认值。

在这种特定情况下,数组索引是键盘扫描代码。0x3a是密钥1中扫描代码(请参见第10.6节)CapsLock0x45是,NumLock且0x46是ScrollLock

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

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

等效于:

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

有趣的是,尽管该链接指出了=必要条件,但在这里似乎并非如此。


13

它(接近)指定初始化器的语法(一种C99功能。

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

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

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

在您的情况下,数组偏移恰好是十六进制(0x3a),它将数组的第58个元素初始化为CAPSLOCK的值,该值大概在您显示的代码上方的代码中定义。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.