我想将所有结构体成员初始化为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条答案
按热度按时间qlckcl4x1#
这只是一个保姆警告..
= {0}
肯定会将所有成员设置为零。它作为警告出现的原因是,您可能会向结构中添加一个字段,并希望确保它正确初始化。有了警告,您可以快速找到这些地方并修复它们。例如,假设您修复了一个初始化器,如下所示:现在,将字段
int e
添加到Stru2
:假设
e
的初始化非常重要,那么,如果没有-Wmissing-field-initializers
,您将不得不在代码中四处搜索,以找到您所关心的每个地方。如果有警告,您将得到一条诊断消息,就像您看到的那样,您可以非常容易地找到并修复它们:不过,为了利用这个警告,你必须检查并完全初始化所有的结构,在你的例子中,这意味着类似于:
s4chpxco2#
是,{0}将所有结构成员设置为0,因为它将第一个成员设置为0,并且默认情况下,所有其他成员都设置为0 * 只要至少有一个成员被初始化 *。请参见Are uninitialized struct members always set to zero?。
tuwxkamq3#
这与GCC bug #53119, --Wmissing-braces wrongly warns about universal zero initializer {0}有关,但我认为您的问题表明,可能至少还有一个其他警告选项添加到该问题。张贴跟踪到错误线程可能有助于解决该问题。