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

时间:2012-05-31 14:54:59

标签: 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:   'int C::a'

这里有什么大不了的,为什么抱怨?这与成员之间的相互依赖性不一样,也可能不存在。原始人,呃。

哦,如何关闭此警告或至少减少它的侵略性?

编辑:有很多方法可以用C ++来自拍;成员相互依赖就是其中之一。我知道这一点,无论如何我都避免这种情况,就像我会避免空指针解除引用一样。

任意初始订单可以非常安全,就像上面的代码段一样。我不满意编译器没有认识到这种情况并抱怨无论如何。我的意思是,它没有抱怨每一个指针取消引用都没有立即进行空检查,是吗?

3 个答案:

答案 0 :(得分:6)

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

更好地重新排序。它可能对编译器没有什么影响,但是你会习惯按照它们出现的顺序初始化成员,这是一件好事。

答案 1 :(得分:0)

  

这与成员之间的相互依赖性不同,或者可能存在。原始人,呃。

呃,除非有人改变它:

class C
{
  int a, b;
public:
  C()
  :b(a), a(0)
  {}
};

大多数人认为在问题发生之前得到关于的警告会更好,这样他们就可以修复代码。你似乎是少数人,他们想让代码故意留下瑕疵并抱怨编译器。

  

任意初始订单可以非常安全,就像上面的代码段一样。

关键是初始化的顺序不是任意的,它始终按成员声明的顺序排列,当我们以错误的顺序编写mem-initializers时,我们中的一些人会被警告。

  

我不满意编译器无法识别此类情况并抱怨无论如何。

如果您不喜欢该警告,请将其关闭,如何做到这一点在文档中(在早期的答案中,所以您甚至不必看远; - )

答案 2 :(得分:0)

非常 抱怨的重要原因,请参阅 Scott Myers book Effective 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;    

w2w1相同吗?