如何删除gcc 4.6中的警告:缺少初始值设定项[-Wmissing-field-initializers]?

时间:2012-11-14 05:50:28

标签: c gcc struct warnings glib

代码:

  GValue value = { 0 };

发出以下警告:

  

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

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

3 个答案:

答案 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 };

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