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