2012-04-13 17 views
-1

Visual Studio 2010.iでWindows7上で既存のC++ 32コードを64コードに移行しようとしています。インターネット参照の助けを借りて私は64ビットコンパイルのセットアップをしました。 64ビットコンパイラなどのVS2010やその他の設定変更などがあります。 プリプロセッサで私はWIN32を削除してWIN64を追加しました。私はOS_WIN_32のようないくつかの他のプリプロセッサと私のコードに固有のいくつかを持っています。 WIN32が使用されていたコードでは、||これは、アプリケーションがwin32とwin64でコンパイルされるようにするためです。 私は64ビットで32ビットアプリケーションを移行する際の問題

致命的なエラーC1189言ってコンパイルエラーを取得していたコードのコンパイルしようとしていた場合:#エラーを:WIN32とWIN64のシンボルの一つだけが、このエラーは、ローカルコードから来ている

を定義する必要があります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を追加するべきではありませんか?私はこのインクルードをコメントしてみましたが、コードで使用されている他のエラーが発生しています。 もし私がWIN32の定義に行けば、VS2010はwindef.hファイルの定義を指しています。このファイルはMicrosoft SDKs \ windows \ v7.0A \ includeフォルダにあります。ローカルコードではありません。その定義を以下に示すために を参照してください。

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

ご協力いただきありがとうございます。

+0

は、 "64ビットC/C++アプリケーションの開発の教訓" を見てみ - http://www.viva64.com/en/l/をし、 "_WIN64/WIN64マクロを使用する" - http://www.viva64.com/en/k/0040/ –

答えて

6

どちらも定義しないでください。これを確認するために使用されるべきマクロのは、これらは、コンパイラによって定義されてい

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

hereを参照)です。

多くの場合、未定義の未修正のバージョンを使用するレガシープロジェクトがビルドできないように、未定義のマクロがコマンドラインに追加されます。文書化された選択肢が存在する場合、それらが機能することはそれらを使用する理由ではありません。


それはこれに沸く:

#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 
+0

あなたの説明を理解するかどうかはわかりません。しかし、私は_WIN64を追加しませんでした。私はWIN64を追加しました。既存のコードはWIN32を使用していました(どちらもアンダースコアなしです).Winef.hファイルのWIN32定義もMicrosoft SDKのものです。 あなたの説明が間違っている場合は、詳細に説明してください。ご迷惑をおかけして申し訳ありません。ありがとう – novice

+0

@novice編集を参照してください。 – rubenvb

+0

の#if以下のように葉は、ツアー最初の答えを読んだ後、私は_WIN32 &&は_WIN64 #エラーWIN32とWIN64のシンボルの一つだけが、まだ私は同じエラーを得た #endifの を定義する必要があります定義されて定義されたコードを編集しました。また、編集したレスポンスを確認した後でもう一度クエリを実行すると、x64コードでは常に_WIN32と_WIN64が定義されます。この理解は正しいのですか?両方とも定義されている場合、エラーをスローするコードを持つことは正しいコーディングではありません。これは正しいですか? – novice

関連する問題