6

我想将所有结构成员初始化为 0。常见的解决方案是做这样的事情:

struct foo bar = {0}

我创建了这个例子:

#include <stdio.h>

struct Stru2 {
    int c;
    int d;
};

struct Stru1 {
    int a;
    Stru2 b;
};

int main()
{
    struct Stru1 aaa = { 0 };
    return aaa.b.c;
}

我用这个参数编译(gcc 4.6.3)它,以确保ANSI如何处理这个

gcc -Wall -Wextra -pedantic -ansi main.cpp

我收到以下警告:

main.cpp: In function ‘int main()’: 
main.cpp:36:28: warning: missing initializer for member ‘Stru1::b’ [-Wmissing-field-initializers]

问题是,为什么-Wextra 会生成此警告?也许并不总是“= {0}”,将所有成员设置为 0?

4

3 回答 3

12

这只是一个保姆警告..= {0}绝对将所有成员设置为零。之所以将其作为警告包含在内,是因为您可能会将字段添加到结构中并且您希望确保它被正确初始化。有了警告,您可以快速找到这些地方并修复它们。例如,假设您修复了一个初始化程序,例如:

struct Stru1 aaa = { 1, { 2, 3 } };

int e现在,添加一个字段Stru2

struct Stru2 {
    int c;
    int d;
    int e;
};

让我们假设e初始化非常重要。好吧,如果没有-Wmissing-field-initializers,您将不得不在代码中四处寻找您关心的每个地方。通过警告,您会收到一条与您看到的类似的诊断消息,您可以非常轻松地找到并修复它们:

struct Stru1 aaa = { 1, { 2, 3, 4 } };

不过,要利用此警告,您必须完成并完全初始化所有结构。在您的情况下,这意味着:

struct Stru1 aaa = { 0, { 0, 0 } };
于 2012-11-05T19:08:00.983 回答
5

是的,{0} 将所有结构成员设置为 0,因为它将第一个成员设置为 0,并且只要至少一个成员被初始化,所有其他成员默认设置为 0 。请参阅未初始化的结构成员是否始终设置为零?.

于 2012-11-05T19:11:53.477 回答
3

这与GCC 错误 #53119 有关, --Wmissing-braces 错误地警告通用零初始化器 {0},但我认为您的问题表明可能至少有一个其他警告选项会增加问题。将后续跟进发布到错误线程可能有助于解决问题。

于 2012-11-05T21:33:53.523 回答