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

aki*_*ast 84 c arrays

static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};
Run Code Online (Sandbox Code Playgroud)

这是什么意思[0x3A]?我只学过像这样的陈述int a[2] = {1, 2};

huo*_*uon 80

这意味着初始化数组的第n个元素.你给出的例子意味着:

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
Run Code Online (Sandbox Code Playgroud)

这些被称为"指定初始化器",实际上是C99标准的一部分.但是,没有的语法=不是.从该页面:

自GCC 2.5以来已经过时但GCC仍然接受的另一种语法是[index]在元素值之前写入,没有=.


Jon*_*art 40

根据GCC文档,这符合ISO C99标准.他们将其称为"指定的初始化器":

要指定数组索引,请在元素值之前写入`[index] ='.例如,

 int a[6] = { [4] = 29, [2] = 15 };
Run Code Online (Sandbox Code Playgroud)

相当于

 int a[6] = { 0, 0, 15, 0, 29, 0 };
Run Code Online (Sandbox Code Playgroud)

我之前从未见过这种语法,但我只是用gcc 4.4.5和-Wall编译它.它成功编译并没有发出警告.

从该示例中可以看出,它允许您初始化特定的数组元素,而保持其他元素不受影响.

  • 没有对象的部分初始化。请参阅 [C99 6.7.8p19](https://port70.net/~nsz/c/c99/n1256.html#6.7.8p19) **[...] 所有未显式初始化的子对象应隐式初始化 [ ...]** 为零。 (2认同)

pax*_*blo 15

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

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

在这种特殊情况下,数组索引是键盘扫描码.0x3a是键#1中扫描码(参见第10.6节)CapsLock,0x45NumLock和0x46 ScrollLock.

在上面的第一个链接上,它声明:

int a[6] = { [4] = 29, [2] = 15 };
Run Code Online (Sandbox Code Playgroud)

相当于:

int a[6] = { 0, 0, 15, 0, 29, 0 };
Run Code Online (Sandbox Code Playgroud)

有趣的是,虽然链接表明这=是必要的,但这似乎并非如此.


Joa*_*son 13

它(接近)指定初始化器的语法,C99功能.

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

int aa[4] = { [2] = 3, [1] = 6 };
Run Code Online (Sandbox Code Playgroud)

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

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

您的代码中的版本=似乎不是gcc特定的扩展名.