当使用指定的初始化器时,如何确保我的结构的每个字段都在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
};
Run Code Online (Sandbox Code Playgroud)
-Wmissing-field-initializers根本没用.它仅适用于GCC(mingw 4.7.3,4.8.1)中的fooo ,并且clang仅略微更好(没有食物和吟游诗人的警告).
我确定没有为指定的初始化程序生成警告的原因(即使我明确要求它们)但我想要/需要它们.我不想基于订单/位置初始化结构,因为这更容易出错(例如交换Start和Stop甚至不会发出任何警告).并且gcc和clang都不会发出任何警告我没有明确初始化字段(按名称初始化时).我也不想因为多种原因而使用if(xy == NULL)行丢弃我的代码,其中一个是我想要编译时警告而不是运行时错误.
至少夹板会给我所有4个案例的警告,但不幸的是我不能一直使用splint(它在一些代码上窒息(无法解析一些C99,GCC扩展)).
注意:如果我使用的是真实函数而不是NULL,GCC也会显示baro警告(但不是bard).
我搜索谷歌和堆栈溢出但只找到相关的问题,并没有找到这个具体问题的答案.我发现的最佳匹配是"确保结构中的所有元素都已初始化" 确保结构中的 所有元素都已初始化 哪个问题几乎相同,但没有令人满意的答案.
有没有更好的处理方法,我没有提到过?(也许是其他代码分析工具?最好可以集成到Eclipse或Visual Studio中的东西(免费)...)
如果我没有弄错,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
因此,我建议您将您的愿望添加到该错误报告中,或者甚至提供补丁.根据我在开源软件方面的经验,最好添加补丁.