7

現在、コードベースを変更して、64 ビット アーキテクチャでコンパイルできるようにしています。私が行わなければならない変更のほとんどは明らかですが、これは私を困惑させました. SetWindowPos2 番目の引数hWndInsertAfterがあります。これは、ウィンドウ ハンドル、または定義済みの値HWND_TOPHWND_BOTTOMHWND_TOPMOSTおよびHWND_NOTOPMOST( MSDN 情報については、こちらを参照してください) のいずれかです。これらの値は で定義されていWinUser.hます。

32 ビット アーキテクチャでは、呼び出しでこれらのいずれかを使用すると正常にSetWindowPos動作しますが、64 ビットでは、コンパイラは次のように文句を言います。

警告 C4306: '型キャスト': 'int' からより大きなサイズの 'HWND' への変換

これは、#defines が [32 ビット] 整数を HWND としてキャストしているためです。

#define HWND_TOPMOST ((HWND)-1)

コンパイラが警告をスローせずに 64 ビット アーキテクチャでこれをコンパイルするには、何を変更する必要がありますか? を使用して警告を無効にする#pragma warning( disable: 4306 )か、#define で 64 ビット int を使用して独自の定義を作成できますが、これを行う「適切な」Microsoft の方法は確かにありますか?

4

2 に答える 2

1

などの 64 ビット整数型へのキャストを介在させずに、32 ビットint-1を 64 ビット ポインター型にキャストしているため、警告がトリガーされます。(A) システム提供のマクロの展開によってのみトリガーされ、(B) 問題は 10 進リテラルであるため、この場合、 MSVCは警告を抑制すべきでしたが、明らかに MSVC の開発者はそれらのヒューリスティックを考えていませんでした。void*intptr_tHWND_TOPMOSTint

満足しない限り、警告を黙らせるためにコードでできることは何もありません

#undef HWND_TOPMOST
#define HWND_TOPMOST ((HWND)(intptr_t)-1)

あるいは、IDE で抑制してみることができます。このスレッドは示唆しています

プロジェクト設定 | C/C++ | 一般および「64ビットの移植性の問題を検出する」をオフにします

/wd4306またはコマンドラインで渡します。

于 2013-11-10T06:21:03.077 に答える