web-dev-qa-db-ja.com

C ++で定義されているWIN32と_WIN32の違いは何ですか

そんなこと知ってる WIN32はwin32コンパイルを示しますが、_WIN32 のために使用される?

69
Adam Naylor

WIN32は、独自のコードで使用したり定義したりできる名前であり、Microsoftの使用法と衝突する可能性があります。 _WIN32は、アンダースコアと大文字で始まるため、実装者(この場合はMicrosoft)に予約されている名前です。独自のコードで予約名を定義することは許可されていないため、衝突することはありません。

49
anon

詳しく説明するには(Neil Butterworthとblue.tuxedoはすでに正しい答えを出している):

  • _WIN32_はSDKまたはビルド環境によって定義されているため、実装予約済みの名前空間を使用しません
  • __WIN32_はコンパイラで定義されているため、アンダースコアを使用して実装予約のネームスペースに配置します

__UNICODE_/UNICODE、__DEBUG_/DEBUG、または多分__DLL_/DLL(UNICODEのものだけが異なるバージョンで多くの用途を得ると思います)。これらの場合(__UNICODE_など)では、アンダースコアバージョンがコンパイラによってby定義されるのではなく、 CRTヘッダーは:

  • __UNICODE_はCRTヘッダーに、UnicodeまたはANSIのいずれかのCRT名(_tcslen()などがワイド文字バリアント(wcslen())にマップする必要があることを伝えます
  • UNICODEは、SDKに対して同様の処理を行います(Win32 APIを「W」バリアントにマッピングします)

基本的に、アンダースコアのあるバージョンはコンパイラーチームによって制御または使用され、アンダースコアのないバージョンはコンパイラー外のチームによって制御/使用されます。もちろん、過去のバージョンとの互換性と、一方のチームまたは他方のチームによる一般的なミスのために、おそらく多くの重複が生じるでしょう。

私はそれを地獄として混乱させています-そして、それらはユーザーコードでほぼ交換可能に使用されていることがわかります(通常、1つが定義されているのを見ると、同じ場所で他の定義が表示されます。必要な場合は他のものが必要です)。個人的には、(コンパイラのランタイムを作成している場合を除き)アンダースコアなしのバージョンをuse使用し、両方が定義されていることを確認する必要があると思います必要に応じて、リスナーまたはコンパイラスイッチを介して)定義するとき。


Mac用にビルドする場合、SDKは__WIN32_を定義することに注意してください。これは、コンパイラが制限を超えていないためです。どのプロジェクトがWin32 APIとMacをターゲットとするコンパイラを使用しているのかわかりません。おそらく、Max向けのOfficeのバージョンなどです。

77
Michael Burr

WIN32は、一部のヘッダーに必要なユーザー定義フラグです。 _WIN32は、ビジュアルC/C++コンパイラによって自動的に定義されます。 _で始まり、その後に大文字が続くため、実装によって予約されています(つまり、C/C++ツールチェーンプロバイダー)。

_WIN32を使用(読み取り)することを好みます。

19
bltxd