故意忽略 GCC 下初始化程序警告中的多余元素

问题描述 投票:0回答:1

我试图滥用静态初始化来构建菜单树而不进行任何运行时初始化:

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
标志(或者,至少,它被称为意外的东西)?

一些相关研究:

c gcc static-initialization
1个回答
0
投票

查看 GCC 强制警告是一个错误:数组初始值设定项中的多余元素和 gcc 源代码,没有选项可以消除警告。

注意:这是一个 XY 问题。它询问是否消除编译器警告。相反,请考虑研究如何正确初始化具有可变数组长度的结构数组。

这个问题还包含一个错误的前提。所有“多余”数据都将被忽略,它们存储在任何地方,只能从源代码中删除。

长度为零的数组是 gcc 扩展。正如 gcc 文档所述 https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html 更喜欢 C99 语法。

© www.soinside.com 2019 - 2024. All rights reserved.