该代码
GValue value = { 0 };
会发出下列警告:缺少初始值设定项[-Wmissing-field-initializers]我知道这是一个GCC bug,但有什么技巧来删除它吗?它真的是不好看到这样的不真实的警告。但我不想电源关闭的警告,因为它会隐藏真正的警告,我也。对不起,但我不能更新我的GCC到4.7(那里看起来像是固定的)版本,还。
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没有文档,但它在这里。
G_VALUE_INIT
GValue
/usr/include/glib-2.0/gobject/gvalue.h
#define G_VALUE_INIT
-Wmissing-field-initializers
GValue value = G_VALUE_INIT;
没有一个通用的解决方案可以在-Wmissing-field-initializers被请求时永远不会得到关于缺少字段初始化的警告。当你请求这样的警告时,你需要编译器警告每个不完整的初始化器。实际上,标准要求所有未显式初始化的struct字段都被置零,而gcc遵守标准。您可以像这样使用diagnostic pragmas
struct
gcc
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
但我的感觉是,你应该小心地编码,显式地初始化所有的字段。你得到的警告更多的是编码风格警告(也许你忘记了一个字段!),而不是bug警告。我还认为,对于你自己的(公共的)struct,你应该使用#define一个初始化宏,如果这样的struct是要被初始化的话。
#define
qkf9rpyu2#
使用. field样式的初始化,例如:
GValue value = { .somefield = 0 };
将导致编译器不发出警告。不幸的是,如果结构是不透明的,这是一个非启动程序。
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)。显然,另一种抑制警告的方法是显式地初始化所有字段,但这可能会很痛苦。
-Werror=missing-field-intializers
3条答案
按热度按时间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
没有文档,但它在这里。没有一个通用的解决方案可以在
-Wmissing-field-initializers
被请求时永远不会得到关于缺少字段初始化的警告。当你请求这样的警告时,你需要编译器警告每个不完整的初始化器。实际上,标准要求所有未显式初始化的struct
字段都被置零,而gcc
遵守标准。您可以像这样使用diagnostic pragmas
但我的感觉是,你应该小心地编码,显式地初始化所有的字段。你得到的警告更多的是编码风格警告(也许你忘记了一个字段!),而不是bug警告。
我还认为,对于你自己的(公共的)
struct
,你应该使用#define
一个初始化宏,如果这样的struct
是要被初始化的话。qkf9rpyu2#
使用. field样式的初始化,例如:
将导致编译器不发出警告。不幸的是,如果结构是不透明的,这是一个非启动程序。
cdmah0mi3#
您可以用途:
来禁止该警告。相反,您可以使用以下命令将其设置为错误:
这两种方法都适用于GCC 4.7.1;我相信它们也可以与GCC 4.6.x一起工作,但是它们不能与GCC的所有早期版本一起工作(GCC 4.1.2可以识别
-Wno-missing-field-initializers
,但不能识别-Werror=missing-field-intializers
)。显然,另一种抑制警告的方法是显式地初始化所有字段,但这可能会很痛苦。