Nie*_*eru 6 c c++ gcc memory-management ansi
我想将所有struct成员初始化为0.常见的解决方案是做这样的事情:
struct foo bar = {0}
Run Code Online (Sandbox Code Playgroud)
我创建这个例子:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我用这个参数编译(gcc 4.6.3),以确保ANSI如何处理它
gcc -Wall -Wextra -pedantic -ansi main.cpp
Run Code Online (Sandbox Code Playgroud)
我收到以下警告:
main.cpp: In function ‘int main()’:
main.cpp:36:28: warning: missing initializer for member ‘Stru1::b’ [-Wmissing-field-initializers]
Run Code Online (Sandbox Code Playgroud)
问题是,为什么-Wextra会产生这个警告?也许并不总是"= {0}",将所有成员设置为0?
Car*_*rum 12
这只是一个保姆警告.. = {0}绝对将所有成员设置为零.将它作为警告包含在内的原因是,您可以在结构中添加字段并确保正确初始化.有了警告,您可以快速找到这些地方并修复它们.例如,假设您修复了一个初始化程序,例如:
struct Stru1 aaa = { 1, { 2, 3 } };
Run Code Online (Sandbox Code Playgroud)
现在,添加一个字段int e到Stru2:
struct Stru2 {
int c;
int d;
int e;
};
Run Code Online (Sandbox Code Playgroud)
让我们假装e初始化是非常重要的.好吧,没有-Wmissing-field-initializers,你必须在你的代码中寻找,找到你关心的每个地方.通过警告,您可以获得类似于您所看到的诊断消息,并且可以非常轻松地找到并修复它们:
struct Stru1 aaa = { 1, { 2, 3, 4 } };
Run Code Online (Sandbox Code Playgroud)
为了获得此警告的优势,您必须完成并完全初始化所有结构.在你的情况下,这意味着:
struct Stru1 aaa = { 0, { 0, 0 } };
Run Code Online (Sandbox Code Playgroud)