【发布时间】:2021-10-03 21:39:48
【问题描述】:
我即将发布一个代码,但我不希望其中包含任何警告。
目前正在使用-Wall -Wextra 寻找我能找到的一切。
现在我有了这个示例代码(非常人为的生产代码):
// Type your code here, or load an example.
#include <iostream>
#include <vector>
using namespace std;
struct A {
union {
int i = 82, j;
};
int a = 98, b = 22;
};
int main() {
A p = {.a = 45};
cout << p.a << endl; // just here to prevent optimization
cout << p.i << endl; // same
return 0;
}
可以在这里测试: Godbolt test case
我得到: 警告:缺少成员“A::”的初始化程序 [-Wmissing-field-initializers]
现在,真正的问题是,真正缺乏初始化可能会产生很多后果(想想现实生活中的损害)。
请注意,所有字段都有默认初始化。并且单元测试表明字段已正确初始化(运气?)
再一次,我对这个警告感到非常不舒服。
需要:
在生产代码中,结构足够大,我不愿意用这种表示法手动初始化所有成员(并且使用许多初始化策略,它很快就会变得难以忍受/容易出错)
我怎样才能设法使这个警告消失(再次考虑在缺乏初始化的情况下造成的损害),而不只是关闭-Wextra?
更新:
我看到了其他相关问题,但考虑到风险,我真的很想深入了解这个特殊案例。
更新2:
阅读不同编译器的程序集,他们似乎采取了正确的行动,但只有 GCC 抱怨。
【问题讨论】:
标签: c++ initialization g++ c++20