编码:
GValue value = { 0 };
给出以下警告:
缺少初始化程序 [-Wmissing-field-initializers]
我知道那是一个gcc's BUG
;但是有什么技巧可以删除它吗?看到这样不真实的警告真的不太好。但我不想关闭警告,因为它也会对我隐藏真正的警告。抱歉,但我还不能将我的 gcc 更新到 4.7(看起来已经修复)版本。
你可以使用:
-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
)。
显然,抑制警告的另一种方法是显式初始化所有字段。不过,这可能会很痛苦。
用于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
它打算被初始化的话。
似乎也使用 .field 样式的初始化,例如:
GValue value = { .somefield = 0 };
将导致编译器不发出警告。不幸的是,如果结构是不透明的,那么这是一个非首发。