15

/Wp64Visual C++ のフラグが非推奨になっているのはなぜですか?

cl : コマンド ライン警告 D9035 :
オプション 'Wp64' は廃止され、将来のリリースで削除される予定です

4

4 に答える 4

17

/Wp64主に、64ビットターゲット用にコンパイルすると、キャッチするように設計された種類のエラーがキャッチされるため、これは推奨されないと思います(/ Wp64は32ビットコンパイルでのみ有効です)。このオプションは、人々がプログラムを 64 ビットに移行し、「64 ビット クリーン」ではないコードを検出するのに役立つように、64 ビット ターゲットが出現したときに追加されました。

/Wp64Microsoft が修正に関心を持っていない問題の例を次に示します。 wp64-compiler-option ):

実際、STL は意図的に と互換性がないわけで/Wp64はなく、完全かつ無条件に と互換性がないわけでもありません/Wp64。根本的な問題は、型システムに完全に統合されていない/Wp64ため、テンプレートとの相互作用が非常に悪いことです。__w64したがって、vector<unsigned int>が の前にインスタンス化されている場合vector<__w64 unsigned int>、両方とも のように動作しvector<unsigned int>、その逆も同様です。x86 では、SOCKETの typedef です__w64 unsigned int。明らかではありませんが、(実装では) によってサポートされているため、vector<unsigned int>の前にインスタンス化されています。vector<SOCKET>vector<bool>vector<unsigned int>

以前 (VC9 以前) では、/Wp64 と テンプレート間のこの不適切な相互作用により、偽の警告が発生していました。ただし、VC10 では、STL への変更により、これがさらに悪化しました。現在、vector::push_back()ベクトル自体の要素が与えられると、他の作業を行う前に要素のインデックスを計算します。そのインデックスは、ベクトルの先頭から要素のアドレスを減算することによって取得されます。あなたの再現では、これには減算が含まれますconst SOCKET * - unsigned int *。(後者は、前述のバグによるものではunsigned int *ありません。) これは、"x86 では同じ型を指しているが、x64 では異なる型を指しているポインターを差し引いています" という偽の警告をトリガーする / はず / です。SOCKET *ただし、ここに 2 番目のバグがあります。 /Wp64本当に混乱し、これは難しいエラーだと思います (constness を に追加している間unsigned int *)。

この偽のエラー メッセージが紛らわしいことに同意します。ただし、沈黙できないコマンド ラインの非推奨警告 D9035 が先行しているため、それで十分であると考えています。/Wp64D9035 は、それを使用すべきではないとすでに述べています (ただし、「このオプションは非常にバグが多く、現在は完全に不要です」とは言いません)。

STL では、が使用される#error場合/Wp64があります。/Wp64ただし、 (非推奨の警告にもかかわらず)まだコンパイルしていて、この偽のエラーをトリガーしていない顧客には問題があります。STL も警告を発する可能性がありますが、コンパイラは既に D9035 を発しています。

于 2011-08-24T06:43:05.957 に答える
4

32 ビット ビルドでの /Wp64 は時間の無駄です。これは非推奨であり、この非推奨は理にかなっています。/Wp64 が 32 ビット ビルドで機能する方法は、型の _w64 注釈を探すことです。この _w64 注釈は、この型が 32 ビット モードでは 32 ビットであっても、64 ビット モードでは 64 ビットであることをコンパイラに伝えます。これは、特にテンプレートが関係している場合、非常に不安定であることが判明しました。

64 ビット ビルドの /Wp64 は非常に便利です。ドキュメント ( http://msdn.microsoft.com/en-us/library/vstudio/yt4xw8fh.aspx) は、64 ビット ビルドではデフォルトでオンになっていると主張していますが、これは正しくありません。コンパイラ警告 C4311 および C4312 は、/Wp64 が明示的に設定されている場合にのみ出力されます。これら 2 つの警告は、32 ビット値がポインターに入れられた場合、またはその逆の場合を示します。これらはコードの正確性にとって非常に重要であり、警告レベル 1 であると主張しています。私は、開発者が 64 ビット ビルドで /Wp64 を有効にしていれば停止していたバグを、非常に広範なコードで発見しました。残念ながら、観察したコマンドライン警告も表示されます。私はこの警告を抑える方法を知りません、そして私はそれと共に生きることを学びました. 明るい面としては、エラーと同様の警告でビルドした場合、このコマンド ラインの警告はエラーにはなりません。

于 2013-02-11T18:55:56.280 に答える
2

VS2010 の 64 ビット コンパイラを使用する場合、コンパイラは 64 ビットの問題を自動的に検出するため...このスイッチは、32 ビット コンパイラを実行して 64 ビットの問題を検出しようとした当時のものです...

http://msdn.microsoft.com/en-us/library/yt4xw8fh%28v=VS.100%29.aspxを参照してください。

于 2011-08-24T06:33:45.250 に答える
0

/Wp64非推奨の警告にリンクできますが、ドキュメントにアクセスできませんか?

既定では、/Wp64 コンパイラ オプションは、Visual C++ 32 ビット コンパイラではオフ、Visual C++ 64 ビット コンパイラではオンになっています。

64 ビット コンパイラを使用してアプリケーションを定期的にコンパイルする場合は、64 ビット コンパイラがすべての問題を検出するため、32 ビット コンパイルで /Wp64 を無効にするだけでかまいません。

強調を追加

于 2011-08-24T06:34:24.767 に答える