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

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

  /* Message Type description array */ char *msgType[M_LAST_MSG] = { [M_INIT_MSG] "Init", [M_RESET_MSG] "Serdes Reset" }; 

M_INIT_MSGM_RESET_MSGM_LAST_MSG是枚举,其对应值为0,1和2.根据正式的C文档,此数组中的变量是字符串(文字),那么以这种方式使用这些枚举的目的是什么呢?备份文件?

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

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

例如,如果你有这个:

 int x[5] = { [2] 3, [4] 7 }; 

它等同于:

 int x[5] = { 0, 0, 3, 0, 7 }; 

在上面的示例中,枚举值指定数组的元素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", }; 

编辑:

请注意,标准中的语法包括a =而OP的示例不包括。 没有=的语法显然是GCC支持的旧语法。 编译OP的示例会发出以下警告:

警告:过时使用没有’=’的指定初始值设定项

GCC文件说明如下:

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

这是一个GNU扩展 。 它在C99中标准化,语法略有不同,即[index]和值之间的等号,无法指定索引范围。 它们被称为指定的初始化器

C标准显示了可能最广泛使用的示例,为枚举提供字符串描述:

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

 enum { member_one, member_two }; const char *nm[] = { [member_two] = "member two", [member_one] = "member one", }; 

它甚至可以提供漂亮的东西

示例11当未经修饰的初始化列表可能被误解时,可以使用指示符来提供显式初始化:

 struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 };