3

次のコード:

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++ で足を撃つ方法はたくさんあります。メンバーの相互依存性はその 1 つです。私はそれを認識しており、ヌルポインターの逆参照を避けるのと同じように、とにかくそれを避けています。

上記のスニペットのように、任意の初期化順序は完全に安全です。コンパイラがそのようなケースを認識せず、とにかく不平を言うことに不満を持っています。つまり、null チェックが直前に行われていないすべてのポインター逆参照について不平を言うわけではありませんね。

4

3 に答える 3

8

この特定の例では、警告は安全に無視できます。それらが互いに依存している場合、問題が発生します。でオフにできます-Wno-reorder

しかし、それらを再注文することをお勧めします。コンパイラには影響しないかもしれませんが、メンバーを出現順に初期化する習慣が身につくでしょう。これは良いことです。

于 2012-05-31T14:57:30.450 に答える
0

メンバー間に相互依存関係がある、またはその可能性があるわけではありません。プリミティブ、当たり前。

ええと、誰かが変更しない限り:

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

ほとんどの人は、問題が発生する前に警告を受けて、コードを修正できるようにした方がよいと考えています。あなたは、意図的にコードに欠陥を残して、コンパイラーに文句を言いたい少数派のようです。

上記のスニペットのように、任意の初期化順序は完全に安全です。

ポイントは、初期化の順序は任意ではなく、常にメンバーが宣言されている順序であり、mem-initializers を間違った順序で記述したときに警告を受けたいという人もいます。

コンパイラがそのようなケースを認識せず、とにかく不平を言うことに不満を持っています。

警告が気に入らない場合は、それをオフにします。その方法はドキュメントにあります(以前の回答にあるので、遠くを見る必要はありません;-)

于 2012-06-02T00:38:03.717 に答える
0

これは、泣き言の非常に大きな理由です。詳細については、 Scott Myersの書籍「Effective C++ Item 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

于 2012-06-02T00:53:35.327 に答える