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

vc6uscn9  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(421)

该代码

GValue value = { 0 };

会发出下列警告:
缺少初始值设定项[-Wmissing-field-initializers]
我知道这是一个GCC bug,但有什么技巧来删除它吗?它真的是不好看到这样的不真实的警告。但我不想电源关闭的警告,因为它会隐藏真正的警告,我也。对不起,但我不能更新我的GCC到4.7(那里看起来像是固定的)版本,还。

cgfeq70w

cgfeq70w1#

使用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遵守标准。
您可以像这样使用diagnostic pragmas

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

但我的感觉是,你应该小心地编码,显式地初始化所有的字段。你得到的警告更多的是编码风格警告(也许你忘记了一个字段!),而不是bug警告。
我还认为,对于你自己的(公共的)struct,你应该使用#define一个初始化宏,如果这样的struct是要被初始化的话。

qkf9rpyu

qkf9rpyu2#

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

GValue value = { .somefield = 0 };

将导致编译器不发出警告。不幸的是,如果结构是不透明的,这是一个非启动程序。

cdmah0mi

cdmah0mi3#

您可以用途:

-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)。
显然,另一种抑制警告的方法是显式地初始化所有字段,但这可能会很痛苦。

相关问题