そんなこと知ってる WIN32
はwin32コンパイルを示しますが、_WIN32
のために使用される?
WIN32
は、独自のコードで使用したり定義したりできる名前であり、Microsoftの使用法と衝突する可能性があります。 _WIN32
は、アンダースコアと大文字で始まるため、実装者(この場合はMicrosoft)に予約されている名前です。独自のコードで予約名を定義することは許可されていないため、衝突することはありません。
詳しく説明するには(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のバージョンなどです。
WIN32は、一部のヘッダーに必要なユーザー定義フラグです。 _WIN32は、ビジュアルC/C++コンパイラによって自動的に定義されます。 _で始まり、その後に大文字が続くため、実装によって予約されています(つまり、C/C++ツールチェーンプロバイダー)。
_WIN32を使用(読み取り)することを好みます。