gcc警告」「後で初期化されます」


228

変更できないサードパーティのコードからこれらの警告がたくさん表示されます。この警告を無効にする方法、または少なくとも特定の領域(VC ++での#pragma push / popなど)に対して無効にする方法はありますか?

例:

list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after 
list.h:1117: warning:   `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_'

実際の警告を数行投稿していただけませんか?また、これがC、C ++であるかどうか、およびソースがある場合は、警告がリンカーまたはコンパイルプロセスからのものであるかどうかも教えてください。
csl

回答:


371

メンバーがクラスに表示されるのと同じ順序でイニシャライザリストに表示されることを確認してください

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

またはあなたが回すことができます -Wno-reorder


91
なぜこれが重要なのですか?なぜこの警告が存在するのですか?
Eloff、2012

40
@Eloff場合によっては(お勧めできません)、初期化は相互に依存する場合がbありaます。世間知らずのユーザーは、何らかの効果を得るために初期化の順序を変更しようとする可能性があり、警告は、それが機能しないことを明らかにします。
Gorpik 2013年

24
それで、宣言の間に関係がなくても、宣言の順序には意味的な意味がありますか?なんて意味がない!
Cuadue 2014

10
これはこの警告が存在する理由を説明-Wno-reorderせず、どのような問題につながる可能性があるかについて言及せずに引用しています。OPが他の詳細を要求しなかったことは承知していますが、投票数が非常に多いので、少なくともコンテキストとこれに関する警告に言及すると思います。OP が書いていたはずの質問に答えるべきではないでしょうか?
underscore_d

4
@ cp.engrメンバーは、init-listでの順序ではなく、宣言の順序で初期化されます。つまり、メンバーの初期化が別のメンバーに依存している場合、宣言が入れ替えられて、依存先の依存関係の後に誰かが初期化されます。それは純粋なUBなので、すぐに非常に悪い時間を過ごすことになります。
underscore_d


17

このエラーのあるQTを使用している場合は、これを.proファイルに追加してください

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

使用-Wno-reorder(man gccはあなたの友達です:))


6
うわー、RT_Mの新しい言い方を見つけました:MIYF(男はあなたの友達です)よろしければ、私はそれを使用します:)
Oren S

4

ライブラリヘッダーのエラーが表示され、GCCを使用している場合は、の-isystem代わりにを使用してヘッダーを含めることで警告を無効にできます-I

clangにも同様の機能があります。

あなたはCMakeのを使用している場合は、指定することができますSYSTEMのためにinclude_directories


「特定するSYSTEM」方法を説明していただけますか?
アインポクルム2016

1
include_directories行の終わりに文字列「SYSTEM」を置くだけです。
Drew Noakes、2016

1

初期化の順序は関係ありません。すべてのフィールドは、クラス/構造体での定義順に初期化されます。ただし、初期化リストの順序が異なる場合、gcc / g ++はこの警告を生成します。この警告を回避するには、初期化順序のみを変更してください。ただし、その構造の前の初期化でを使用してフィールドを定義することはできません。実行時エラーになります。したがって、定義の順序を変更します。注意して注意してください!


OPは、警告の意味やコードの修正方法ではなく、警告を無効にする方法を知りたいと考えていました。実際、投稿にはコードがサードパーティであり、変更できないと書かれています。定義の順序を変更することはできず、おそらく初期化の順序も変更できません。
Tim Seguine 2013

それは非常に多くありません初期化リストで2番目のオブジェクトが第一のオブジェクトからinitdをされていますが、それらは、ヘッダに間違った方法の周りに宣言されている場合は問題。その場合、物事は非常に奇妙になる可能性があります。
underscore_d 2015

0
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

aがbの前に初期化され、aがbに依存する場合、順序は重要です。未定義の動作が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.