代码:
GValue value = { 0 };
发出以下警告:
缺少初始值设定项[-Wmissing-field-initializers]
我知道那是gcc's BUG
;但有一些技巧可以删除它吗?真的不太好看到这种不真实的警告。但我不希望断电警告,因为它也会隐藏我的真实警告。很遗憾,但我无法将我的gcc更新为4.7(看起来它已修复)版本,但是。
答案 0 :(得分:10)
您可以使用:
-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
)。
显然,抑制警告的另一种方法是显式初始化所有字段。但这可能很痛苦。
答案 1 :(得分:8)
使用G_VALUE_INIT
初始化GValue
- s。他们的(私人)结构位于/usr/include/glib-2.0/gobject/gvalue.h
,#define G_VALUE_INIT
适当。
我强烈不同意你的评估,认为这是GCC的错误。如果未使用-Wmissing-field-initializers
明确初始化某个字段,并且您收到了应得的警告,则会要求您收到警告。
可悲的是G_VALUE_INIT
没有记录,但它就在这里。代码
GValue value = G_VALUE_INIT;
如果询问-Wmissing-field-initializers
,则没有通用解决方案永远不会收到有关丢失字段初始化的警告。当您要求这样的警告时,您需要编译器警告每个不完整的初始化程序。实际上,标准要求将所有非显式初始化struct
字段归零,gcc
遵守标准。
您可以使用diagnostic pragmas之类的
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
但我的感觉是你应该谨慎编码,并明确初始化所有字段。你得到的警告更多的是编码风格警告(也许你忘了一个字段!)而不是错误警告。
我也相信,对于您自己的(公开)struct
,您应该#define
初始化宏,如果要初始化此类struct
。
答案 2 :(得分:1)
似乎也使用.field风格的初始化,例如:
GValue value = { .somefield = 0 };
将导致编译器不发出警告。不幸的是,如果结构是不透明的,那么这是一个非首发。