c - 使用指定的初始化器范围在 C 中初始化结构数组的所有结构成员

标签 c gcc

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

编辑:错误是

error: array index range in initializer exceeds array bounds 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 ... 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

关于c - 使用指定的初始化器范围在 C 中初始化结构数组的所有结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56146769/

相关文章:

c++ - 为什么删除移动构造函数会导致编译错误?

c++ - 如何查看.a(存档)文件的 "index"信息?

c - Makefile 中的标志和宏是什么?

c - 遍历文件目录并将每一行读入数组

android - 删除原生 android 中的循环依赖

c++ - 如何检查C++中使用了哪个构造函数

c - sscanf 可选列

c - 在32位ARM架构中安装gcc

C - fscanf 扫描集在换行后不工作

C++ 如何将整数和长整型转换为 char 数组