WIN32
win32 コンパイルを意味することは知っていますが、何に_WIN32
使用されますか?
3 に答える
詳しく説明します (Neil Butterworth と blue.tuxedo は既に正しい答えを出しています):
WIN32
SDK またはビルド環境によって定義されるため、実装の予約済み名前空間は使用されません。_WIN32
コンパイラによって定義されるため、アンダースコアを使用して実装予約の名前空間に配置します
_UNICODE
ほぼ同じ名前で、 / UNICODE
、_DEBUG
/ DEBUG
、または多分_DLL
/などの同様の用途を持つ同様の二重定義のセットを見つけることができますDLL
(異なるバージョンで多くの用途があるのは UNICODE のものだけだと思います)。これらのケース ( など_UNICODE
) では、アンダースコア バージョンがコンパイラによって定義される代わりに、 CRT ヘッダーの動作を制御するために使用されることがあります。
_UNICODE
CRT ヘッダーに、Unicode または ANSI のいずれかの CRT 名 (_tcslen()
ワイド文字バリアント (wcslen()
)にマップする必要があるなど) を伝えます。UNICODE
SDK に対して同様の処理を行います (Win32 API をその "W
" バリアントにマップします)。
基本的に、アンダースコアのあるバージョンはコンパイラ チームによって制御または使用されます。アンダースコアのないバージョンは、コンパイラの外部のチームによって制御または使用されます。もちろん、過去のバージョンとの互換性と、どちらかのチームによる一般的な間違いのために、多くの重複が発生する可能性があります。
私はそれが非常に紛らわしいと思います-そして、それらはユーザーコードでほとんど同じように使用されていることがわかりました(通常、一方が定義されているのを見ると、もう一方が同じ場所で定義されているのが見えます。なぜなら、一方が必要な場合はもう一方が必要だからです)。個人的には、アンダースコアなしのバージョンを使用し (コンパイラのランタイムを作成している場合を除く)、両方を定義するときに (必要に応じてヒアラーまたはコンパイラ スイッチを介して) 両方が定義されるようにする必要があると思います。
SDK は、Mac 用にビルドするときに定義することに注意してください_WIN32
。これは、コンパイラが定義しないためです。どのプロジェクトが Win32 API を使用し、Mac を対象とするコンパイラを使用しているかはわかりません。おそらく、Max 用の Office のバージョンなどです。
WIN32
は、独自のコードで使用および定義することもできる名前であるため、Microsoft の使用法と衝突する可能性があります。_WIN32
は、アンダースコアと大文字で始まるため、実装者 (この場合は Microsoft) 用に予約されている名前です。独自のコードで予約名を定義することは許可されていないため、競合することはありません。
WIN32 は、一部のヘッダーで必要になる可能性があるユーザー定義のフラグです。_WIN32 は、ビジュアル C/C++ コンパイラによって自動的に定義されます。これは _ で始まり、その後に大文字が続くため、実装 (つまり、C/C++ ツールチェーン プロバイダー) によって予約されています。
私は_WIN32を使用(読み取り)することを好みますが、より安全に思えます。