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

Jac*_*ack 4 c gcc struct warnings glib

代码:

  GValue value = { 0 };
Run Code Online (Sandbox Code Playgroud)

发出以下警告:

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

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

Jon*_*ler 10

你可以使用:

-Wno-missing-field-initializers
Run Code Online (Sandbox Code Playgroud)

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

-Werror=missing-field-initializers
Run Code Online (Sandbox Code Playgroud)

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

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


Bas*_*tch 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;
Run Code Online (Sandbox Code Playgroud)

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

您可以使用诊断编译指示

#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
Run Code Online (Sandbox Code Playgroud)

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

我也相信,对于你自己的(公共的),struct你应该#define初始化宏,如果这struct是为了初始化.

  • 但它*是*一个错误.`{0}`是所谓的"通用零初始化器",当使用它时,一个**显式**将所有字段初始化为其逻辑0.因此,GCC(或Clang或任何其他编译器)对此类情况发出此类警告毫无意义. (5认同)
  • @pwseo旧帖子,但你的陈述不正确.C语言确实_not_将`{0}`视为一种特殊情况.没有"通用零初始化器"这样的东西也不是`{0}`一种显式初始化整个数组/结构的方法.`{0}`只是意味着:_初始化第一个元素为零,然后让其他所有成员初始化,就像它们有静态存储持续时间一样,这是隐式完成的.这就是为什么`{1}`只将第一个元素初始化为1而其余元素初始化为零,它的工作方式完全相同. (5认同)
  • @Lundin确实,`{0}`不是"通用零初始化器",但`{}`是"通用初始化器",按照标准,*总是*填充结构为0表示没有字段用户定义的初始值设定项/无构造函数.经常使用这种语言工具,因为0是程序员通常想要的.很多时候,这与C结构一起使用(显然)没有初始化器,并且没有可能添加初始化器.警告是一个(非常烦人的)GCC错误.为什么添加添加非必需的,无用的约束会分散程序员的注意力? (3认同)
  • 您可以使用“{0,}”(注意逗号)将所有字段初始化为零,但它会在某些结构布局上阻塞。这与 C 语言最接近“通用零初始化器”一样。如果您*真的*想要一个通用的零初始化器,请在结构实例上使用`memset()`。 (2认同)