如何删除gcc 4.6中的警告:缺少初始化程序?

代码:

GValue value = { 0 }; 

发出以下警告:

缺少初始值设定项[-Wmissing-field-initializers]

我知道这是一个gcc's BUG ; 但有一些技巧可以删除它吗? 真的不太好看到这种不真实的警告。 但是我不希望断电警告,因为它也会隐藏我的真实警告。 很抱歉,但我无法将我的gcc更新为4.7(看起来它已修复)版本。

使用G_VALUE_INIT初始化GValue -s。 它们的(私有)结构位于/usr/include/glib-2.0/gobject/gvalue.h ,其中#define G_VALUE_INIT正确。

我非常不同意你的评估,认为这是GCC的错误。 如果未使用-Wmissing-field-initializers显式初始化-Wmissing-field-initializers并且您收到应得的警告,则会要求发出警告。

遗憾的是G_VALUE_INIT没有记录,但它就在这里。 代码用

 GValue value = G_VALUE_INIT; 

如果-Wmissing-field-initializers则没有通用解决方案永远不会收到有关丢失字段初始化的警告。 当您要求这样的警告时,您需要编译器警告每个不完整的初始化程序。 实际上,标准要求将所有非显式初始化的struct域归零,并且gcc遵循该标准。

您可以使用诊断编译指示

 #pragma GCC diagnostic ignored "-Wmissing-field-initializers" 

但我的感觉是你应该谨慎编码,并明确初始化所有字段。 您收到的警告更多是编码样式警告(可能您忘记了字段!)而不是错误警告。

我也相信,对于你自己的(公共) struct ,如果要初始化这样的struct ,你应该#define一个初始化宏。

你可以使用:

 -Wno-missing-field-initializers 

特别禁止警告。 相反,您可以将其变为错误:

 -Werror=missing-field-initializers 

这两个都与GCC 4.7.1一起使用; 我相信它们也适用于GCC 4.6.x,但它们不适用于所有早期版本的GCC(GCC 4.1.2识别-Wno-missing-field-initializers但不是-Werror=missing-field-intializers )。

显然,抑制警告的另一种方法是显式初始化所有字段。 但这可能很痛苦。

它似乎也使用.field风格的初始化,例如:

 GValue value = { .somefield = 0 }; 

将导致编译器不发出警告。 不幸的是,如果结构是不透明的,这是一个非首发。