2012-11-05 44 views
5

我想所有的结构成员初始化为0。常用的解决方法是让这样的事情:初始化结构成员为0(GCC -Wextra)

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?

+0

当你用'{}'初始化时,它是否也会产生警告? (我认为这将是更习惯的形式。) –

+0

为什么不使用memset? –

+3

@JamesKanze:初始化'{}'无效C. – pmg

回答

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

除了这个,“Wextra”还有其他“保姆”警告。有时他们很烦人,但其他时候,代码的作者可以非常感谢他们。 –

+0

+1 @DavidHammen。我还喜欢它在条件中检测到'='而不是'=='的意外使用。我不知道这是否是'-Wextra'家族中的一员,但是这是个不错的选择。 –

+0

这是'-Wparentheses'警告,它是由'-Wall'启用的。 –