C结构声明数组

C结构声明数组,c,arrays,struct,C,Arrays,Struct,在Linux内核中,我看到一个结构数组的声明,如下所示 struct SomeStructName [] ={ [SOMEWEIRD_NAME] = { .field1 = "some value" }, [SOMEWEIRD_NAME2] = { .field1 = "some value1" }, } 我从未见过这样的声明,特别是我无法理解

在Linux内核中,我看到一个结构数组的声明,如下所示

struct SomeStructName [] ={
[SOMEWEIRD_NAME] = {
                   .field1 = "some value"
                   },
[SOMEWEIRD_NAME2] = {
                   .field1 = "some value1"
                   },
}
我从未见过这样的声明,特别是我无法理解
[SOMEWEIRD\u NAME]
的含义以及使用它的原因。“SOMEWEIRD\u NAME”很可能是一个定义,其值是一个数字,或者是一个枚举,其数值是它在枚举中的位置。

它是数组的C99

例如:

/* 
 * Initialize element  0 to 1
 *                     1 to 2
 *                     2 to 3
 *                   255 to 1   
 * and all other elements to 0
 */
int arr[256] = {[0] = 1, 2, 3, [255] = 1};
它允许您以任何顺序初始化某些特定数组元素,还允许您省略某些元素


在您的示例中,
[]
之间的表达式可以是整数常量表达式或
枚举
常量的宏名称。它不能是一个变量名,因为它必须是一个整型常量表达式。

我不确定你的意思,但我假设
SOMEWEIRD\u name
是一个定义值

Define是一种给值起另一个名字的方法,但它不会占用运行时内存中的空间,相反,在编译过程中,只要在代码中写入定义值的名称,就会替换Define

deifne的语法如下:
#define NAME_OF_define 80
在以下示例中,代码中定义的每个
名称都将替换为值80。请注意,不应以
结束该行

在您的示例中,我希望
SOMEWEIRD\u NAME
有一个numbric值来设置数组的大小


您可以详细了解
#define

它是的GNU扩展。@Kninnug它不是GNU扩展,它是有效的C99@ouah我认为C99只允许
.field
语法。看起来我错了,虽然GCC确实有一些标准中没有的额外语法。@Kninnug范围语法(例如,
[0..255]
)是GNU扩展EAH在我的例子中,它实际上是一个枚举,编译器将其解释为整数,因此一些奇怪的名称变成了0