将结构成员初始化为0(GCC -WEXTRA)
Initialize struct members to 0 (gcc -Wextra)
我想初始化所有struct成员的成员为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 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 } };
是的,{0}将所有struct成员设置为0,因为它将第一个成员设置为0,默认情况下,所有其他成员至少设置为0 一个成员是初始化的。请参阅非初始化的结构成员始终设置为零?。
这与GCC错误#53119有关, - - wmissing-braces错误地警告了通用零初始化器{0},但我认为您的问题表明至少可能有其他警告选项添加到问题中。将随访发布到错误线程可能有助于解决问题。
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 即使启用了 Wextra,gcc 也不会给出将无符号整数< 0 进行比较的警告
- 将结构成员初始化为0(GCC -WEXTRA)