GValue value = { 0 };
会出现以下警告:
缺少初始化程序[-Wmissing-field-initializers]
我知道这是一个 GCC bug,但是有没有什么诀窍可以解决它?看到这种不真实的警告真的很不好。但是我不想关闭警告,因为它也会隐藏真正的警告。对不起,我还不能将GCC升级到4.7(在那里似乎已经修复),所以只能暂时忍受。
使用 G_VALUE_INIT
来初始化 GValue
。它们的(私有)结构在 /usr/include/glib-2.0/gobject/gvalue.h
中,其中通过 #define G_VALUE_INIT
适当地定义。
我强烈反对你的评估认为这是GCC的错误。您需要使用 -Wmissing-field-initializers
显式地初始化字段,并且您会得到应有的警告。
遗憾的是,虽然没有文档,但是 G_VALUE_INIT
在这里。代码如下:
GValue value = G_VALUE_INIT;
如果要求编译器发出每个不完整初始化的警告,那么就没有一种万无一失的方法来避免缺少字段初始化的警告。实际上,标准要求所有未明确初始化的结构体字段都被清零,而 gcc
遵循该标准。您可以使用类似诊断指示语句的方式。
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
但我的感觉是你应该仔细编码,并显式初始化所有字段。你得到的警告更多是一种编码风格警告(也许你忘记了一个字段!)而不是一个错误警告。
我还相信,对于你自己(公共)的struct
,如果这样的struct
被预期要初始化,那么你应该#define
一个初始化宏。
{0}
视为特殊情况。也不存在所谓的“通用零初始化器”,{0}
也不是一种显式地初始化整个数组/结构体的方法。{0}
仅仅意味着:_将第一个元素初始化为零,然后让每个其他成员隐式地按照静态存储期进行初始化_。这就是为什么{1}
只将第一个元素初始化为1,其余的都是零,因为它的工作方式完全相同。 - Lundin{0,}
(注意逗号)将所有字段初始化为零,但它会卡在某些结构体布局上。这是C语言能够接近的“万能零初始化器”。如果你真的需要一个万能的零初始化器,在结构体实例上使用memset()
函数。 - Philip Withnall你可以使用:
-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
)。
显然,抑制警告的另一种方法是显式初始化所有字段。不过那可能很麻烦。
GValue value = { .somefield = 0 };
这将导致编译器不发出警告。但如果结构体是不透明的,这是不可行的。
{0}
将会把所有成员都设置为0
。正如您在我的帖子中所看到的,这是在 C 标准中描述的。 - Jack