将结构体成员初始化为0(gcc -Wextra)

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呢?

当您使用“{}”进行初始化时,它是否也会生成警告?(我认为这将是更惯用的形式。) - James Kanze
3
@JamesKanze 说的“初始化 {} 是无效的 C 语言代码”。 - pmg
@pmg 这个程序是用C++编写的。在struct Stru1的成员变量中,有一个类型为Stru2 b;,但没有定义typedef struct Stru2 Stru2; - Daniel Fischer
@DanielFischer:你说得对。我刚才只看了标签,忽略了代码。 - pmg
@pmg(我必须承认,直到我的编译器抱怨之前,我也没有注意到。) - Daniel Fischer
1
这个问题刚在GCC源代码库中修复,应该会在下一个版本(4.9.1?4.10.0?)中消失。 - R.. GitHub STOP HELPING ICE
3个回答

12

这只是一个助手式的警告。 = {0} 一定会将所有成员设置为零。它被包含在警告中的原因是为了在您向结构添加字段并且希望确保其得到正确初始化的情况下使用。具有警告可以让您快速找到这些地方并进行修复。例如,假设您已经修复了以下类似的初始化器:

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

现在,向 Stru2 添加一个字段 int e
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 } };

1
“-Wextra”除了这个警告之外,还有其他的“保姆”警告。有时它们很烦人,但其他时候代码的作者可能会非常感激它们。 - David Hammen
+1 @DavidHammen。我也喜欢在条件语句中检测意外使用“=”而不是“==”。我不知道这是否属于“-Wextra”系列之一,但这是一个很好的功能。 - Carl Norum
这是一个“-Wparentheses”警告,它由“-Wall”启用。 - David Hammen

5

3
这与GCC bug #53119有关,--Wmissing-braces错误地警告通用零初始化器{0},但我认为您的问题表明可能还有至少一个其他警告选项导致问题。在错误线程上发布后续帖子可能有助于解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接