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

标签 c++ c gcc memory-management ansi

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

最佳答案

这只是一个保姆警告.. = {0} 肯定会将所有成员设置为零。将它作为警告包含在内的原因是您可能会向结构中添加一个字段并且您希望确保它被正确初始化。收到警告可以让您快速找到这些地方并修复它们。例如,假设您修复了一个类似于以下内容的初始化程序:

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

现在,添加一个字段int eStru2:

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 } };

关于c++ - 将结构成员初始化为 0 (gcc -Wextra),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13238635/

相关文章:

c++ - CMake 更改强制 DESTINATION 目录名称(安装目标)

c++ - 更改代码生成后以代码 255 退出的特定代码行

c - 让 asprintf 使用同时也是输入的非 NULL 目标指针是否安全?

c - C 中 if/else 语句的问题

c++ - 在按钮点击时控制 qt 中的循环

c++ - 如何使用 unique_ptr<double[]> 为类设置析构函数。该实例由 make_unique() 创建

c - 我怎样才能压缩这个使用 ANSI 颜色的 printf ?

c - 来自平面汇编器的 Visual Studio LNK1107 : invalid or corrupt file - . obj (COFF)

linux - 检查库构建的标志或选项(-frecord-gcc-switches)

c++ - 为什么 GCC 调用 libc 的 sqrt() 而不使用它的结果?