12

使用指定的初始化程序时,如何确保我的结构的每个字段都在 GCC 中初始化?(我对函数指针特别感兴趣。)(我使用的是 C 而不是 C++。)

这是一个例子:

typedef struct {
    int a;
    int b;
} foo_t;

typedef struct {
    void (*Start)(void);
    void (*Stop)(void);
} bar_t;

foo_t fooo = { 
        5 
    };

foo_t food = { 
        .b=4 
    };

bar_t baro = {
        NULL
    };

bar_t bard = { 
        .Start = NULL
    };

-Wmissing-field-initializers 根本没有帮助。它仅在GCC (mingw 4.7.3, 4.8.1) 中对 fooo 有效,而clang的效果只是稍微好一点(没有针对食物和吟游诗人的警告)。

我确信没有为指定的初始化程序生成警告(即使我明确要求它们)是有原因的,但我想要/需要它们。我不想根据订单/位置初始化结构,因为这更容易出错(例如交换 Start 和 Stop 甚至不会给出任何警告)。而且 gcc 和 clang 都不会给出任何警告,表明我未能显式初始化字段(按名称初始化时)。由于多种原因,我也不想在代码中乱扔 if(xy==NULL) 行,其中之一是我想要编译时警告而不是运行时错误。

至少夹板会在所有 4 种情况下给我警告,但不幸的是我不能一直使用夹板(它阻塞了一些代码(无法解析一些 C99、GCC 扩展))。

注意:如果我使用真正的函数而不是 NULL GCC 也会显示 baro 警告(但不是 bard)。

我搜索了谷歌和堆栈溢出,但只找到了相关问题,并没有找到这个特定问题的答案。我发现的最佳匹配是“确保结构中的所有元素都已初始化” 确保结构中的所有元素都已初始化 它提出了几乎相同的问题,但没有令人满意的答案。

有没有更好的方法来处理这个我没有提到的?(也许其他代码分析工具?最好是可以集成到 Eclipse 或 Visual Studio 中的东西(免费)......)

4

2 回答 2

6

如果我没记错的话,C 标准指定其他字段自动初始化为 0

因此,您所要求的 - 未初始化字段时的编译错误 - 将不符合C(现代?)规范。

C99 标准,第 127 页:http ://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。

gccs-Wmissing-field-initializers被记录为使用指定的初始化程序发出警告。有一个增强请求,-Wmissing-field-initializers=2然后也会发出警告:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=39589

所以我建议你将你的愿望添加到那个错误报告中,或者甚至提供一个补丁。根据我对开源软件的经验,最好添加补丁。

于 2013-10-17T16:24:22.840 回答
1

您展示的四种方式都初始化了结构的其余部分。它被初始化为 0(或等效的类型)。

于 2013-10-17T15:52:19.390 回答