Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除gcc 4.6中的警告:缺少初始值设定项[-Wmissing字段初始值设定项]?_C_Gcc_Struct_Warnings_Glib - Fatal编程技术网

如何删除gcc 4.6中的警告:缺少初始值设定项[-Wmissing字段初始值设定项]?

如何删除gcc 4.6中的警告:缺少初始值设定项[-Wmissing字段初始值设定项]?,c,gcc,struct,warnings,glib,C,Gcc,Struct,Warnings,Glib,守则: GValue value = { 0 }; 发出以下警告: 缺少初始值设定项[-w缺少字段初始值设定项] 我知道这是一个错误;但是有什么办法可以消除它吗?看到这样不真实的警告真不好。但我不想关闭警告,因为它也会对我隐藏真正的警告。很抱歉,但是我还不能将我的gcc更新到4.7(看起来它是固定的)版本。使用G\u VALUE\u INIT初始化GValue-s。它们的(私有)结构位于/usr/include/glib-2.0/gobject/gvalue.h中,它适当地定义了G#u值

守则:

  GValue value = { 0 };
发出以下警告:

缺少初始值设定项[-w缺少字段初始值设定项]


我知道这是一个错误;但是有什么办法可以消除它吗?看到这样不真实的警告真不好。但我不想关闭警告,因为它也会对我隐藏真正的警告。很抱歉,但是我还不能将我的gcc更新到4.7(看起来它是固定的)版本。

使用
G\u VALUE\u INIT
初始化
GValue
-s。它们的(私有)结构位于
/usr/include/glib-2.0/gobject/gvalue.h
中,它适当地定义了G#u值


我强烈不同意您的评估,即这是GCC的缺陷。如果未使用
-Wmissing字段初始值设定项显式初始化字段,您会要求得到警告,并且您会得到应得的警告

遗憾的是,
G_VALUE_INIT
没有文档记录,但它就在这里。编码

GValue value = G_VALUE_INIT;
如果询问
-Wmissing field initializer
,没有通用的解决方案可以永远不会收到缺少字段初始化的警告。当您要求这样一个警告时,您需要编译器对每个不完整的初始值设定项发出警告。事实上,该标准要求所有非显式初始化的
struct
字段归零,并且
gcc
遵守该标准

你可以像

但我的感觉是,您应该谨慎地编写代码,并显式地初始化所有字段。您得到的警告更多的是一个编码风格的警告(可能您忘记了一个字段!),而不是一个bug警告

我还认为,对于您自己的(公共)
struct
,您应该定义一个初始化宏,如果要初始化这样的
struct

您可以使用:

-Wno-missing-field-initializers
明确禁止该警告。相反,您可以通过以下方式将其变成错误:

-Werror=missing-field-initializers
这两项工作均符合GCC 4.7.1的要求;我相信它们也适用于GCC 4.6.x,但它们不适用于所有早期版本的GCC(GCC 4.1.2识别
-Wno缺少字段初始值设定项,但不识别
-Werror=缺少字段初始值设定项


显然,抑制警告的另一种方法是显式初始化所有字段。不过,这可能会很痛苦。

使用.field样式的初始化似乎也很痛苦,例如:

GValue value = { .somefield = 0 };

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

我高度怀疑这是一个gcc错误。你能告诉我们GValue的结构定义吗?这只是一个例子;我正在寻找一种适用于任何结构的解决方案。@GajananH我想我们可以假设它是一个GLib GValue-这意味着它有多个成员(实际上,什么有价值的结构没有多个成员?@hobbs:independent结构有多少成员,通过使用
{0}
所有成员应设置为
0
。它是在C标准中描述的,正如你在我文章的链接中看到的,没有bug。根据该标准,一致性实现可以出于任何原因(包括外观原因)发出诊断消息,只要它仍然接受有效的程序(即,它是警告而不是错误)。您可以禁用此特定警告。“我强烈不同意您的评估,即这是GCC的错误”-同意。更进一步,初始化所有内容并让优化器丢弃虚假负载。跟踪这类错误变得很旧,因为程序员试图变得聪明(内存管理器没有提供一个零的页面)。但这是一个错误
{0}
是所谓的“通用零初始值设定项”,当使用它时,会显式地将所有字段初始化为其逻辑零。因此,GCC(或Clang,或任何其他编译器)在这种情况下发出这样的警告是没有意义的。@pwseo旧帖子,但您的语句是不正确的。C语言不将
{0}
视为特例。没有“通用零初始值设定项”这样的东西,
{0}
也不是显式初始化整个数组/结构的方法
{0}
的简单意思是:将第一个元素初始化为零,然后让每个其他成员都进行初始化,就像它们具有静态存储持续时间一样,这是隐式完成的。这就是为什么
{1}
只将第一个元素初始化为1,其余元素初始化为零,其工作原理完全相同。@Lundin实际上,
{0}
不是“通用零初始化器”,而是
{}
是“通用初始化器”,根据标准,对于没有用户定义初始值设定项/没有构造函数的字段,始终使用0填充结构。这种语言工具经常被使用,因为0是程序员通常想要的。很多时候,这是用于C结构(显然)没有初始值设定项,也不可能添加初始值设定项。该警告是一个(非常恼人的)GCC错误。为什么要添加非必需的、无用的约束,这会使程序员从实际的内容中分心?您可以使用
{0,}
(注意逗号)将所有字段初始化为零,但它会阻塞某些结构布局。这与C接近“通用零初始化器”。如果您真的想要一个通用的零初始值设定器,请在struct实例上使用
memset()
。对于最新的gcc版本,这可能不再是真的(我在不同的代码库上看到了相同的警告,使用指定的初始值设定器,如您所示,使用arm gcc 8)。有趣。IIRC C标准要求使用此构造将所有未命名字段初始化为其零值。所以没有未初始化的字段。我相信它不会初始化,只是警告缺少显式初始化器。而且,似乎这种警告只发生在C++,而不是C代码。另见
GValue value = { .somefield = 0 };