202

LinuxとWindowsでc++コードを実行したいと思います。一方のオペレーティングシステムにのみ含め、もう一方のオペレーティングシステムには含めないコードがいくつかあります。一度使用できる標準の#ifdefはありますか?

何かのようなもの:

  #ifdef LINUX_KEY_WORD
    ... // linux code goes here.
  #elif WINDOWS_KEY_WORD
    ... // windows code goes here.
  #else 
  #error "OS not supported!"
  #endif

質問は確かに重複していますが、ここでの答えははるかに優れており、特に受け入れられたものです。

4

7 に答える 7

243

使用する:

#ifdef __linux__ 
    //linux code goes here
#elif _WIN32
    // windows code goes here
#else

#endif
于 2011-07-11T12:21:15.457 に答える
64

できるよ:

#if MACRO0
    //code...
#elif MACRO1
    //code...
#endif

…識別子は次のとおりです。

    __linux__       Defined on Linux
    __sun           Defined on Solaris
    __FreeBSD__     Defined on FreeBSD
    __NetBSD__      Defined on NetBSD
    __OpenBSD__     Defined on OpenBSD
    __APPLE__       Defined on Mac OS X
    __hpux          Defined on HP-UX
    __osf__         Defined on Tru64 UNIX (formerly DEC OSF1)
    __sgi           Defined on Irix
    _AIX            Defined on AIX
    _WIN32          Defined on Windows
于 2014-03-24T22:54:01.733 に答える
14

使用するコンパイラによって異なります。

たとえば、Windowsの定義はWIN32または_WIN32です。

また、Linuxの定義はUNIXor__unix__またはLINUXor__linux__です。

于 2011-07-11T12:21:48.513 に答える
12

この応答はマクロ戦争に関するものではありませんが、一致するプラットフォームが見つからない場合はエラーが発生します。

#ifdef LINUX_KEY_WORD   
... // linux code goes here.  
#elif WINDOWS_KEY_WORD    
... // windows code goes here.  
#else     
#error Platform not supported
#endif

がサポートされていない場合#errorは、static_assert (C++0x) キーワードを使用できます。または、カスタム STATIC_ASSERT を実装するか、サイズ 0 の配列を宣言するか、ケースが重複するスイッチを使用することもできます。つまり、実行時ではなくコンパイル時にエラーを生成します

于 2011-07-11T15:41:16.133 に答える
7

コンパイラによって異なります。たとえば、LinuxではG ++、WindowsではVC ++を使用してコンパイルすると、次のようになります。

#ifdef linux
    ...
#elif _WIN32
    ...
#else
    ...
#endif
于 2011-07-11T12:23:19.267 に答える
4

いいえ、これらの定義はコンパイラに依存します。できることは、独自の定義セットを使用して、Makefile に設定することです。詳細については、このスレッドを参照してください。

于 2011-07-11T12:19:27.493 に答える