使用指定的初始化程序时,如何确保我的结构的每个字段都在 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 中的东西(免费)......)