【问题标题】:Initialize all struct members of struct array in C, using designated intializers range使用指定的初始化器范围在 C 中初始化结构数组的所有结构成员
【发布时间】:2019-05-15 10:09:00
【问题描述】:

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

编辑:错误是

错误:初始化程序中的数组索引范围超出数组边界 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
}

我做错了什么,这甚至可以使用结构数组吗?

【问题讨论】:

  • 我添加了 gcc 标签,因为此代码不是有效的 C 代码而是 gcc 非标准扩展。

标签: c gcc


【解决方案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

【讨论】:

  • aaaahhhhhhhh,当然......我真傻......谢谢你:)
【解决方案2】:

如果有人想知道如何用纯标准 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多