GCC 警告初始化顺序与声明顺序不匹配
GCC warns about order of initialization not matching the order of declaration
以下代码:
class C
{
int a, b;
public:
C()
:b(0), a(0)
{}
};
导致 GCC 抱怨错误的初始化顺序。具体说来:
../AppSrc/MainForm.cpp: In constructor 'C::C()':
../AppSrc/MainForm.cpp:51:9: warning: 'C::b' will be initialized after
../AppSrc/MainForm.cpp:51:6: warning: 'int C::a'
这有什么大不了的,为什么要抱怨?这不像成员之间存在或可能存在相互依赖关系。原始人,呃。
哦,我如何关闭此警告或至少使其不那么激进?
编辑:有很多方法可以在C++中搬起石头砸自己的脚;成员相互依赖就是其中之一。我知道这一点,无论如何我都会避免它,就像我会避免空指针取消引用一样。
任意初始化顺序可以是完全安全的,就像上面的代码片段一样。我对编译器不承认这种情况并抱怨感到不满。我的意思是,它不会抱怨每个指针取消引用之前没有立即进行空检查,是吗?
在此特定示例中,可以安全地忽略警告。如果它们相互依赖,你就会遇到问题。您可以使用 -Wno-reorder
.
但最好重新排序它们。它可能对编译器没有影响,但你会养成按照成员出现的顺序初始化成员的习惯,这是一件好事。
这不像成员之间存在或可能存在相互依赖关系。原始人,呃。
呃,除非有人改变它:
class C
{
int a, b;
public:
C()
:b(a), a(0)
{}
};
大多数人认为最好在问题发生之前收到警告,以便他们可以修复代码。您似乎是少数人,他们希望故意使代码有缺陷并抱怨编译器。
任意初始化顺序可以是完全安全的,就像上面的代码片段一样。
关键是初始化的顺序不是任意的,它总是按照成员的声明顺序,当我们以错误的顺序编写 mem 初始化器时,我们中的一些人希望得到警告。
我对编译器不承认这种情况并抱怨感到不满。
如果您不喜欢警告将其关闭,则如何在文档中执行此操作(以及在较早的答案中,因此您甚至不必看得太远;-)
这是抱怨的一个非常重要的原因,有关详细信息,请参阅斯科特迈尔斯书有效C++第 13 项第 57 页。
或者正如他在第58页所说的那样:
class Wacko {
public:
Wacko(const char *s): s1(s), s2(0) {}
Wacko(const Wacko &rhs): s2(rhs.s1), s1(0) {}
private:
string s1, s2;
};
Wacko w1 = "Hello World!";
Wacko w2 = w1;
w2
和w1
一样吗?
- 按顺序声明的字符数组重叠
- 为什么结构属性声明和初始化顺序的行为是这样的?
- 类之外的 C++ 是保证为构造顺序的可变声明的顺序
- 重载函数声明的顺序在 c++ 中重要吗?
- C :使用声明和指令的顺序会影响选择
- 分割错误取决于我在C 中声明的顺序
- 当指定初始化程序的顺序和字段声明不一致时,clang可以删除函数调用
- Boost MPL-按顺序声明每种类型的类
- 如何按行主要顺序声明 3DArray
- 更改声明顺序时输出不正确
- 使用gcc插件修改变量声明的顺序
- 当某些结构字段被省略或与结构声明中的顺序不同时,如何实现正确的解析?
- 为什么类成员总是按照声明的顺序进行初始化
- GCC 警告初始化顺序与声明顺序不匹配
- 如果在一行中声明两个对象,则按什么顺序构造它们
- 我们可以在 C 或 C++ 中打乱声明顺序吗?
- 类中方法声明的顺序是否对编译器很重要
- 如何根据方法实现的声明顺序对其进行排序
- 交叉引用、前向声明等:按什么顺序
- 成员声明顺序在类中如果彼此依赖,则为最优解