0

VisualStudio2010を使用してWindows7で既存のC++32コードを64コードに移行しようとしています。これまで64ビットコンパイルを行ったことはありません。インターネット参照の助けを借りて、私は64ビットコンパイルのセットアップを行いました。64ビットコンパイラなどを備えたVS2010やその他の構成変更など。プリプロセッサで、WIN32を削除し、WIN64を追加しました。OS_WIN_32のような他のプリプロセッサや、コードに固有のプリプロセッサがいくつかあります。WIN32が使用されているコードでは、||として追加の条件を追加しました。WIN64これは、アプリケーションがwin64だけでなくwin32でもコンパイルされるようにするためだけのものです。コードをコンパイルしようとすると、コンパイルエラーが発生します。

致命的なエラーC1189:#error:WIN32およびWIN64シンボルの1つのみを定義する必要があります

このエラーは、WIN32とWIN64の両方が定義されているかどうかを確認するローカルコードが原因で発生します。そのコードは以下のとおりです。

#if defined WIN32 && defined WIN64
# error Only one of the WIN32 and WIN64 symbols should be defined
#endif

VS2010では、マクロが有効になっていない場合、マクロ内のコードはグレー表示されます。私のコードでも、上記のエラーはグレー表示されています。しかし、それでも私はそのエラーを受け取っています。

WIN64を追加したコードにはwindows.hが含まれています。参考までに、以下にそれを示します。

#if defined WIN32 || defined WIN64
#include <windows.h>
#include <process.h>
#endif

だから私の質問は、なぜ私はこのエラーが発生するのですか?64ビットコンパイル用にwindows.hを追加するべきではありません。このインクルージョンにコメントしてみましたが、コードで使用されているHANDLEで他のエラーが発生しています。WIN32定義に移動すると、VS2010はwindef.hファイルの定義を指しています。このファイルは、Microsoft SDKs \ windows \ v7.0A \ includeフォルダーにあります。つまり、ローカルコードではありません。参考までに、その定義を以下に示します。

#ifndef WIN32
#define WIN32
#endif

だから私はコンパイラがプリプロセッサWIN32とWIN64の両方を取得している理由を知りたいです。

よろしくお願いします。

4

1 に答える 1

6

どちらも自分で定義するべきではありません。これを確認するために使用する必要があるマクロは次のとおりです。

_WIN32 // always defined for Windows apps
_WIN64 // only defined for x64 compilation

これらはコンパイラによって定義されます (こちらを参照)。

多くの場合、IDE は接頭辞なしのマクロをコマンドラインに追加して、文書化されていない接頭辞なしのバージョンを使用するレガシー プロジェクトがビルドに失敗しないようにします。文書化された代替手段が存在する場合、それらが機能するという事実はそれらを使用する理由にはなりません。


要約すると、次のようになります。

#ifdef _WIN32
  // We're on Windows, yay!
#ifdef _WIN64
  // We're on x64! Yay!
#else // _WIN64
  // We're on x86 (or perhaps IA64, but that one doesn't matter anymore). Yay!
#endif // _WIN64
#else // _WIN32
  // We're not on Windows, maybe WindowsCE or WindowsPhone stuff, otherwise some other platform
 #endif
于 2012-04-13T08:47:26.817 に答える