如何删除gcc 4.6中的警告:缺少初始化程序?
代码:
GValue value = { 0 };
发出以下警告:
缺少初始值设定项[-Wmissing-field-initializers]
我知道这是一个gcc's BUG
; 但有一些技巧可以删除它吗? 真的不太好看到这种不真实的警告。 但是我不希望断电警告,因为它也会隐藏我的真实警告。 很抱歉,但我无法将我的gcc更新为4.7(看起来它已修复)版本。
使用G_VALUE_INIT
初始化GValue
-s。 它们的(私有)结构位于/usr/include/glib-2.0/gobject/gvalue.h
,其中#define G_VALUE_INIT
正确。
我非常不同意你的评估,认为这是GCC的错误。 如果未使用-Wmissing-field-initializers
显式初始化-Wmissing-field-initializers
并且您收到应得的警告,则会要求发出警告。
遗憾的是G_VALUE_INIT
没有记录,但它就在这里。 代码用
GValue value = G_VALUE_INIT;
如果-Wmissing-field-initializers
则没有通用解决方案永远不会收到有关丢失字段初始化的警告。 当您要求这样的警告时,您需要编译器警告每个不完整的初始化程序。 实际上,标准要求将所有非显式初始化的struct
域归零,并且gcc
遵循该标准。
您可以使用诊断编译指示
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
但我的感觉是你应该谨慎编码,并明确初始化所有字段。 您收到的警告更多是编码样式警告(可能您忘记了字段!)而不是错误警告。
我也相信,对于你自己的(公共) struct
,如果要初始化这样的struct
,你应该#define
一个初始化宏。
你可以使用:
-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
)。
显然,抑制警告的另一种方法是显式初始化所有字段。 但这可能很痛苦。
它似乎也使用.field风格的初始化,例如:
GValue value = { .somefield = 0 };
将导致编译器不发出警告。 不幸的是,如果结构是不透明的,这是一个非首发。