C++ GCC警告初始化顺序与声明顺序不匹配

C++ GCC警告初始化顺序与声明顺序不匹配,c++,gcc,constructor,C++,Gcc,Constructor,以下代码: 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

以下代码:

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++中有很多方法可以让自己的脚开枪;成员相互依赖性就是其中之一。我意识到了这一点,并且我避免了这种情况,就像我避免空指针去引用一样


任意init顺序可以是完全安全的,就像上面的代码片段一样。我很不高兴编译器没有认识到这样的情况,并抱怨无论如何。我的意思是,它不会抱怨没有立即执行空检查的每个指针解引用,是吗?

在这个特定示例中,可以安全地忽略警告。如果他们互相依赖,你就有麻烦了。您可以使用
-Wno reorder
将其关闭

但是最好重新排序。这可能不会对编译器产生影响,但您会养成按成员出现的顺序初始化成员的习惯,这是一件好事

成员之间不存在或可能存在相互依赖关系。原语,嗯

呃,除非有人改变它:

class C
{
  int a, b;
public:
  C()
  :b(a), a(0)
  {}
};
大多数人认为最好在问题发生之前得到警告,这样他们就可以修复代码。你似乎是少数人,他们想故意留下有缺陷的代码,并抱怨编译器

任意init顺序可以是完全安全的,就像上面的代码片段一样

关键是初始化的顺序不是任意的,它总是按照声明成员的顺序,我们中的一些人希望在以错误的顺序编写mem初始值设定项时得到警告

我很不高兴编译器没有认识到这样的情况,并抱怨无论如何


<如果你不喜欢警告关闭它,如何在文档中进行(并且在更早的答案中,所以你甚至不必看远;-)/P> < P>是<强>非常/强> <强>哀鸣的大原因,参见Scott Myers书有效C++ 13第57页的详细信息。p> 或者正如他在第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
相同吗?

消除此特定警告的最简单和最可靠的方法是将成员及其初始化按相同顺序排列。绝对不是最简单的,考虑到在不同编译器/设置下顺利编译的遗留代码数量,修复错误代码始终是一件好事,即使代码只是稍微有点不正确。毕竟,你的公司有初级程序员,不是吗?@SevaAlekseyev,问题是init顺序不是任意的,它是由变量声明的顺序定义的。无论您在初始值设定项列表中指定了什么顺序,它都会被完全忽略。所以它不是在抱怨你做了不安全的事情,而是在警告你,这实际上改变了你写的东西。现在我明白了。回答一个问题。如果它们相互依赖,我会将init第一个放在基中,这样可以保证正确的初始化顺序。所有这些相互依赖的坏习惯。我宁愿让编译器发牢骚。@SevaAlekseyev,我不明白你为什么反对这个警告。C++标准允许它不应该有的东西,GCC正在为你检测这个。通常,当您看到初始化列表时,您会假定它是按照它出现的顺序处理的,但在这种情况下,它实际上会在您身上重新排序。知道编译器何时对初始化进行重新排序似乎是件好事。@edA-qamort-ora-y我想op知道这一点,他想消除警告。他似乎知道这意味着什么。“鲁基安格雷格——不要忽视警告——前面可能有悬崖。我已经用C++工作了15年。现在是我第一次看到编译器抱怨。在不远的过去,这不是一件大事吗?更确切地说,您是应该注意相互依赖性和init问题顺序的人。