【问题标题】:C array of structs declarationC 结构体数组声明
【发布时间】:2016-02-19 06:25:39
【问题描述】:

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

struct SomeStructName [] ={
[SOMEWEIRD_NAME] = {
                   .field1 = "some value"
                   },
[SOMEWEIRD_NAME2] = {
                   .field1 = "some value1"
                   },
}

我从未见过这样的声明,特别是我无法弄清楚[SOMEWEIRD_NAME] 的含义以及使用它的原因。

【问题讨论】:

  • 这是designated initializers 的 GNU 扩展。
  • @Kninnug 这不是 GNU 扩展,它是有效的 C99
  • @ouah 我以为 C99 只允许 .field 语法。看来我错了,尽管 GCC 确实有一些标准中没有的额外语法。
  • @Kninnug 范围语法(例如,[0..255])是 GNU 扩展

标签: c arrays struct


【解决方案1】:

这是一个用于数组的 C99 designated initializer

例如:

/* 
 * 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 是一种为值指定另一个名称的方法,但它不会在运行时占用您的内存空间,因此,在编译过程中,在您的代码中写入已定义值的名称的任何地方,它都会被替换。

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

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

    您可以详细了解#definehere

    【讨论】:

      【解决方案3】:

      “SOMEWEIRD_NAME”很可能是一个#define,其值为一个数字,或者它是一个枚举,其数值是它在枚举中的位置。

      【讨论】:

      • 是的,就我而言,它实际上是一个枚举,编译器将其解释为整数,因此 SOMEWEIRD_NAME 变为 0
      猜你喜欢
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多