如何删除警告在GCC 4.6:缺少初始化[-Wmissing场-初始化](How to remove

2019-08-02 17:42发布

代码:

  GValue value = { 0 };

给出以下警告:

缺少初始化[-Wmissing场-初始化]

我知道这是一个gcc's BUG ; 但有一些技巧,以去除呢? 真的不是很好看这种虚幻的警告。 但我不希望断电警告,因为它会隐藏真实的警告从我也是。 虽然令人遗憾,但我无法将GCC升级到4.7(其中,看起来好像是固定的)版本,还没有。

Answer 1:

使用G_VALUE_INIT初始化GValue -s。 他们(私人的)结构是/usr/include/glib-2.0/gobject/gvalue.h其中#define G_VALUE_INIT适当。

我强烈的评估,这是GCC的bug不同意。 你问如果一个字段未明确初始化警告-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是为了进行初始化。



Answer 2:

你可以使用:

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

显然,其他的方式来抑制警告是明确初始化所有领域。 这可能是痛苦的,但。



Answer 3:

还可以看出使用初始化点域风格,如:

GValue value = { .somefield = 0 };

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



文章来源: How to remove the warning in gcc 4.6: missing initializer [-Wmissing-field-initializers]?