コードが Windows 用にコンパイルされているかどうかを判断するマクロはありますか?

[編集:コンパイル時マクロを使用して、現在の環境を判断したいと考えています。 Windows の代わりに Linux などで Wine を実行しているかどうかを判断したいかもしれませんが、一般的に、コンパイラは特定の環境を対象としており、それは Windows (DOS) であるか、そうでないかのどちらかですが、めったに (決して?) 両方。]

一部のコンパイラは、Windows ビルド環境を示すマクロを提供します。ただし、これらはコンパイラごとに異なります。ターゲット環境が そうでない場合は、Windows 上の同じコンパイラでも異なります。 排他的にウィンドウ。通常は __WIN32__ です 、常にではありません。

#if defined (__WIN32__)
  // Windows stuff
#endif

_WIN32 になることもあります 、 __CYGWIN32__ 、またはおそらく単にコンパイラ インジケータ (_MSC_VER )。

(makefile から) ビルドする環境がわかっている場合は、通常 #define を渡すことができます。 コマンドラインで、「g++ -D __WIN32__ yourfile.c」のように ".

ここにもう少し情報があります


コンパイル、ホスト、およびランタイム環境を検出するには、さまざまな方法があります。すべては、正確に何を知りたいかによって異なります。環境には大きく分けて 3 つのタイプがあります:

  • ビルド :これは、プログラムがコンパイルされる環境です。
  • ホスト :これは、プログラムが実行されている環境です。
  • ターゲット :コード生成ツール (コンパイラなど) の場合、ここで生成されたコードが実行されます。

クロスコンパイルしている場合 、ビルドおよびホスト環境は完全に異なる可能性があり (これは組み込みアプリケーションをビルドする場合は一般的ですが、デスクトップ/サーバー アプリをビルドする場合はあまり一般的ではありません)、通常、コンパイルに使用されたシステムでコンパイル済みのバイナリを実行することはできません。それ以外の場合、ホスト環境はビルド環境と互換性がある必要があります。たとえば、Vista で実行される XP でアプリケーションをビルドする場合などです。

C プリプロセッサ マクロを使用して、ホスト システムの詳細 (つまり、何を実行しているか) を通知することはできません。コードが何のためにコンパイルされたかを示すことしかできません。 Windows の場合、最も重要な 2 つのマクロは次のとおりです。

  • _WIN32 Win32 API が利用可能であることを示します。 しない 実際、_WIN32 は、Cygwin の GCC と MinGW の GCC の両方を使用する場合に定義されます。したがって、Visual Studio でコンパイルされているかどうかを判断するために _WIN32 を使用しないでください。
  • _MSC_VER プログラムが Microsoft Visual C/C++ でコンパイルされていることを示します。よくほとんど。 _MSC_VER また Visual C++ のドロップイン置換を目的とした Intel の C++ コンパイラを使用する場合に定義されます。

Visual Studio のドキュメントで説明されている他のマクロが多数あります。

使用している Windows の正確なバージョンを知りたい場合は、GetVersion() などのランタイム関数を使用する必要があります (他の回答で説明されています)。

確認したいことを正確に教えていただければ、より具体的な回答が得られる可能性があります。


% touch foo.C ; g++ -dM -E foo.C

[マシン固有の] g++ コンパイラによって自動的に定義されたすべてのマクロ (#define の) を一覧表示してくれます。

Microsoft のコンパイラにも似たようなものがあるかもしれません...