8

编码:

  GValue value = { 0 };

给出以下警告:

缺少初始化程序 [-Wmissing-field-initializers]

我知道那是一个gcc's BUG;但是有什么技巧可以删除它吗?看到这样不真实的警告真的不太好。但我不想关闭警告,因为它也会对我隐藏真正的警告。抱歉,但我还不能将我的 gcc 更新到 4.7(看起来已经修复)版本。

4

3 回答 3

11

你可以使用:

-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)。

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

于 2012-11-14T06:38:19.897 回答
9

用于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遵守该标准。

您可以使用诊断编译指示,例如

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

但我的感觉是,您应该谨慎编码,并明确初始化所有字段。您收到的警告更像是编码风格的警告(也许您忘记了一个字段!)而不是错误警告。

我还相信,对于您自己的(公共)struct,您应该#define使用一个初始化宏,如果struct它打算被初始化的话。

于 2012-11-14T06:19:24.630 回答
1

似乎也使用 .field 样式的初始化,例如:

GValue value = { .somefield = 0 };

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

于 2014-12-13T16:28:35.233 回答