将struct成员初始化为0(gcc -Wextra)

时间:2012-11-05 19:05:12

标签: c++ c gcc memory-management ansi

我想将所有struct成员初始化为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?

3 个答案:

答案 0 :(得分: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 } };

答案 1 :(得分:5)

是,{0}将所有struct成员设置为0,因为它将第一个成员设置为0,并且所有其他成员默认设置为0 ,只要至少有一个成员被初始化 。请参阅Are uninitialized struct members always set to zero?

答案 2 :(得分:3)

这与GCC bug #53119, --Wmissing-braces wrongly warns about universal zero initializer {0}有关,但我认为您的问题表明可能至少有一个其他警告选项会添加到问题中。发布bug线程的后续操作可能有助于解决问题。