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

iswrvxsc  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(231)

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

qlckcl4x

qlckcl4x1#

这只是一个保姆警告.. = {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 } };
s4chpxco

s4chpxco2#

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

tuwxkamq

tuwxkamq3#

这与GCC bug #53119, --Wmissing-braces wrongly warns about universal zero initializer {0}有关,但我认为您的问题表明,可能至少还有一个其他警告选项添加到该问题。张贴跟踪到错误线程可能有助于解决该问题。

相关问题