我试图滥用静态初始化来构建菜单树而不进行任何运行时初始化:
typedef struct {
menu_entry_t entry;
uint16_t can_loop:1;
uint16_t sz:15;
uint32_t entries[0];
} __attribute__((packed)) menu_data_t;
static menu_data_t menu_list[] = {
{
.entry = MENU_COIL_POWER,
.can_loop = 0,
.sz = 5,
.entries = {
RGB(0x0F, 0x0A, 0x00),
RGB(0x1F, 0x15, 0x00),
RGB(0x3F, 0x29, 0x00),
RGB(0x7F, 0x53, 0x00),
RGB(0xFF, 0xA5, 0x00),
}
},
{
.entry = MENU_LED_MODE,
.can_loop = 0,
.sz = 3,
.entries = {
RGB(63, 63, 0),
RGB(127, 127, 0),
RGB(255, 255, 0),
}
},
// ...
};
这个构建,但是 GCC 不出所料地抱怨
entries
子数组的初始化:
warning: excess elements in array initializer
如何消除此特定警告? 我完全知道它是生成的,因为我已经声明了数组大小为零的
uint32_t entries[0]
。 这是我过去通过 malloc(sizeof(menu_data_t) + num_entries * sizeof(uint32_t))
动态利用的一个范例;我现在只是尝试静态地执行此操作。
那么,简而言之,如何在初始值设定项警告中禁用 GCC 的多余元素(最好是可以输入到
#pragma GCC diagnostic ignored "..."
中的内容)? 搜索 GCC 的文档似乎没有明确的 -W
标志(或者,至少,它被称为意外的东西)?
一些相关研究:
-Wno-override-init
无论如何都不起作用。查看 GCC 强制警告是一个错误:数组初始值设定项中的多余元素和 gcc 源代码,没有选项可以消除警告。
注意:这是一个 XY 问题。它询问是否消除编译器警告。相反,请考虑研究如何正确初始化具有可变数组长度的结构数组。
这个问题还包含一个错误的前提。所有“多余”数据都将被忽略,它们不存储在任何地方,只能从源代码中删除。
长度为零的数组是 gcc 扩展。正如 gcc 文档所述 https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html 更喜欢 C99 语法。