在C中使用非标准的数组声明

use*_*550 7 c arrays gcc

我遇到了以下代码,它以非标准的方式声明了char *数组C:

    /* Message Type description array */ 
    char *msgType[M_LAST_MSG] = 
    {    
       [M_INIT_MSG]     "Init", 
       [M_RESET_MSG]    "Serdes Reset"
    };
Run Code Online (Sandbox Code Playgroud)

M_INIT_MSG,M_RESET_MSG并且M_LAST_MSG是相应值为0,1和2的枚举.根据正式C文档,此数组中的变量是字符串(文字),那么以这种方式使用这些枚举的目的是什么,是否有任何文档来支持它吗?

用ARM gcc编译器编译gcc-arm-none-eabi.

dbu*_*ush 6

此语法允许您通过索引初始化数组的特定元素.您可以使用其中一个intenum值来指定要初始化的数组元素.这样,您指定的值不需要是连续的.

例如,如果你有这个:

int x[5] = { [2] 3, [4] 7 };
Run Code Online (Sandbox Code Playgroud)

它等同于:

int x[5] = { 0, 0, 3, 0, 7 };
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,枚举值指定将数组的元素0和1初始化为"Init""Serdes Reset".

C99标准的第6.7.8节开始:

18每个指示符列表以与最近的周围括号对相关联的当前对象开始描述.指定符列表中的每个项目(按顺序)指定其当前对象的特定成员,并将下一个指示符(如果有)的当前对象更改为该成员.在指示符列表末尾生成的当前对象是由以下初始值设定项初始化的子对象.

33示例9可以使用指示符初始化数组以对应枚举的元素:

enum { member_one, member_two };
const char *nm[] = {
    [member_two] = "member two",
    [member_one] = "member one",
};
Run Code Online (Sandbox Code Playgroud)

编辑:

请注意,标准中的语法包含一段=时间OP的示例.没有语法=显然是GCC支持的旧语法.编译OP的示例会发出以下警告:

警告:过时使用指定的初始化程序而不使用'='

海湾合作委员会的文件规定如下:

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

  • 没有等号的语法是GNU特定的. (2认同)
  • 这并没有回答为什么问题中的语法有效.OP显然知道标准语法. (2认同)