使用指定的初始化器范围初始化C中struct数组的所有struct成员

时间:2019-05-15 10:09:00

标签: c gcc

使用范围时,无法获得指定的初始化程序语法。我知道数组可以使用指定的初始化程序,并且我想初始化一个结构数组,以便所有成员在启动时都相同。

编辑:错误是

  

错误:初始化程序中的数组索引范围超出了数组范围32 |
  [0 ... NODELIST_LEN] .dev_status = DW_DEV_DISABLED

typedef struct {
  int dev_status;
}DW_data; 

typedef struct{
  DW_data list[NODELIST_LEN];
}DW_nodelist;

我尝试了以下方法:

DW_nodelist dw_list = {
    .list[0 ... NODELIST_LEN].dev_status = DW_DEV_DISABLED
}

DW_nodelist dw_list = {
    .list = {
        [0 ... NODELIST_LEN].dev_status = DW_DEV_DISABLED
    }
}

我什至只是为了笑而对它们进行了旋转:

DW_nodelist dw_list = {
    .list = {
        .dev_status[0 ... NODELIST_LEN] = DW_DEV_DISABLED
    }
}

DW_nodelist dw_list = {
    .list = [0 ... NODELIST_LEN].dev_status = DW_DEV_DISABLED
}

我在做什么错,使用结构数组是否有可能?

2 个答案:

答案 0 :(得分:1)

您超出了0 ... NODELIST_LEN的数组范围。您必须在NODELIST_LEN - 1停留。

以下内容将起作用:

DW_nodelist dw_list = {
    .list[0 ... NODELIST_LEN-1].dev_status = DW_DEV_DISABLED
};

请注意,...(指定元素范围)的使用是标准C不支持的特定于GCC的扩展。

如果您使用-Wpedantic选项,则GCC编译器会发出警告。

warning: ISO C forbids specifying range of elements to initialize [-Wpedantic]
   13 |     .list[0 ... NODELIST_LEN-1].dev_status = DW_DEV_DISABLED

答案 1 :(得分:1)

万一有人想知道如何使用纯标准C语言做同样的事情,那会有些棘手。鉴于此:

#define DW_DEV_DISABLED 666
#define NODELIST_LEN 32

typedef int DW_data;
typedef struct{
  DW_data list[NODELIST_LEN];
}DW_nodelist;

我们可以为数组初始化做一个宏:

DW_nodelist dw_list = 
{ 
  .list = { INIT(NODELIST_LEN, DW_DEV_DISABLED) } 
};

其中宏的第一个参数是要初始化的项目数,第二个是值。因此,在这里我们要将32个项目设置为某个非零值。在标准C语言中是可能的,但是我们需要声明很多这样的宏:

#define INIT_1(val)  val
#define INIT_2(val)  INIT_1(val),  INIT_1(val)
#define INIT_4(val)  INIT_2(val),  INIT_2(val)
#define INIT_10(val) INIT_4(val),  INIT_4(val),  INIT_2(val)
#define INIT_32(val) INIT_10(val), INIT_10(val), INIT_10(val), INIT_2(val)

然后我们可以使用另一个宏来调用它们,以使其全部具有一定的可变性:

#define PREPROC(n, val) INIT_##n(val)
#define INIT(n, val) PREPROC(n, val)