使用范围时,无法获得指定的初始化程序语法。我知道数组可以使用指定的初始化程序,并且我想初始化一个结构数组,以便所有成员在启动时都相同。
编辑:错误是
错误:初始化程序中的数组索引范围超出了数组范围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
}
我在做什么错,使用结构数组是否有可能?
答案 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)