257

コードがコンパイルされるオペレーティングシステムに基づいて、さまざまなことを実行するためのコードが必要です。私はこのようなものを探しています:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

これを行う方法はありますか?同じことをするより良い方法はありますか?

4

16 に答える 16

385

The Predefined Macros for OS site has a very complete list of checks. Here are a few of them, with links to where they're found:

Windows

_WIN32   Both 32 bit and 64 bit
_WIN64   64 bit only
__CYGWIN__

Unix (Linux, *BSD, but not Mac OS X)

See this related question on some of the pitfalls of using this check.

unix
__unix
__unix__

Mac OS X

__APPLE__ Also used for classic
__MACH__

Both are defined; checking for either should work.

Linux

__linux__
linux Obsolete (not POSIX compliant)
__linux Obsolete (not POSIX compliant)

FreeBSD

__FreeBSD__

Android

__ANDROID__

于 2011-11-23T21:21:42.100 に答える
79

WindowsでGCCが定義するものを表示します。

gcc -dM -E - <NUL:

Linuxの場合:

gcc -dM -E - </dev/null

MinGWで事前定義されたマクロ:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

UNIXの場合:

unix __unix__ __unix
于 2009-03-15T11:12:04.427 に答える
8

ほとんどの場合、特定の機能が存在するかどうかを確認することをお勧めします。例: 関数pipe()が存在するかどうか。

于 2008-09-26T23:55:01.310 に答える
8

Microsoft C/C++ コンパイラ (MSVC) の定義済みマクロは、ここにあります。

私はあなたが探していると思います:

  • _WIN32- コンパイル ターゲットが 32 ビット ARM、64 ビット ARM、x86、または x64 の場合は 1 として定義されます。それ以外は未定義
  • _WIN64- コンパイル ターゲットが 64 ビット ARM または x64 の場合は 1 として定義されます。それ以外の場合は未定義。

gcc コンパイラの定義済みマクロはここにあります

私はあなたが探していると思います:

  • __GNUC__
  • __GNUC_MINOR__
  • __GNUC_PATCHLEVEL__

事前に定義された適切なコンパイラをグーグルで検索してください。

于 2008-09-26T23:58:19.163 に答える
4

C 標準に従って設定された標準マクロはありません。一部の C コンパイラは、一部のプラットフォームで 1 つを設定します (たとえば、Apple のパッチを適用した GCC は、マクロを設定して、Apple システムで Darwin プラットフォーム用にコンパイルしていることを示します)。プラットフォームや C コンパイラも何かを設定する場合がありますが、一般的な方法はありません。

hayalci が言ったように、ビルド プロセスでこれらのマクロを何らかの方法で設定するのが最善です。コードを変更せずに、ほとんどのコンパイラでマクロを定義するのは簡単です。-D MACRO単純に GCC に渡すことができます。

gcc -D Windows
gcc -D UNIX

そしてあなたのコードで:

#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
#    error Unsupported operating system
#endif
于 2008-09-27T00:08:43.273 に答える
2

OSsymbol は、#define OSsymbolターゲットOS を識別するためのシンボルです。#ifdef OSsymbol#define

通常、選択した OS シンボルを定義する中央ヘッダー ファイルをインクルードし、OS 固有のインクルードおよびライブラリ ディレクトリを使用してコンパイルおよびビルドします。

開発環境を指定していませんでしたが、コンパイラが一般的なプラットフォームと OS のグローバルな定義を提供していると確信しています。

http://en.wikibooks.org/wiki/C_Programming/Preprocessorも参照してください。

于 2008-09-26T23:52:50.240 に答える
0

一部のコンパイラは、これに役立つ#definesを生成します。コンパイラのドキュメントを読んで、それらが何であるかを判断してください。MSVCはそれを定義します__WIN32__GCCはあなたが見ることができるいくつかを持っていますtouch foo.h; gcc -dM foo.h

于 2008-09-26T23:52:06.607 に答える