C结构体数组声明

9
在Linux内核中,我看到一个声明结构体数组的语句,它看起来像这样:
struct SomeStructName [] ={
[SOMEWEIRD_NAME] = {
                   .field1 = "some value"
                   },
[SOMEWEIRD_NAME2] = {
                   .field1 = "some value1"
                   },
}

我从未见过这样的声明,特别是我无法理解 [SOMEWEIRD_NAME] 是什么意思,以及为什么要使用它。


3
这是GNU对指定初始化器的扩展。 - Kninnug
@Kninnug 这不是 GNU 扩展,它是合法的 C99。 - ouah
@ouah 我以为C99只允许使用.field语法。不过似乎我错了,尽管GCC有一些标准中没有的额外语法。 - Kninnug
@Kninnug 范围语法(例如 [0..255])是 GNU 扩展。 - ouah
3个回答

5

这是一个针对数组的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};

它允许您以任意顺序初始化特定的数组元素,并允许省略某些元素。
在您的示例中,[]之间的表达式可以是整数常量表达式或enum常量的宏名称。它不能是变量名,因为它必须是一个整数常量表达式。

2

我不确定您的意思,但我认为SOMEWEIRD_NAME是一个定义值。

定义是一种给值另一个名称的方式,但它不会在运行时占用您的内存空间。相反,在编译过程中,它将替换代码中定义值名称的所有位置。

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

在您的示例中,我期望SOMEWEIRD_NAME具有数字值来设置数组的大小。

您可以在此处找到有关#define的更多信息。


1
"SOMEWEIRD_NAME" 很可能是一个 #define,其值为一个数字,或者是一个枚举类型,在枚举中的位置就是它的数值。

是的,在我的情况下,它实际上是一个枚举,由编译器解释为整数,因此SOMEWEIRD_NAME变成了0。 - Michael P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接