web-dev-qa-db-ja.com

WindowsおよびLinuxでのC ++コンパイル:ifdefスイッチ

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

何かのようなもの:

  #ifdef LINUX_KEY_Word
    ... // linux code goes here.
  #Elif WINDOWS_KEY_Word
    ... // windows code goes here.
  #else 
  #error "OS not supported!"
  #endif

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

149
Sardathrion

つかいます:

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

#endif
151

私はそれが答えではないことを知っていますが、誰かがQtで同じように見える場合は追加しました

In Qt

https://wiki.qt.io/Get-OS-name-in-Qt

QString Get::osName()
{
#if defined(Q_OS_Android)
    return QLatin1String("Android");
#Elif defined(Q_OS_BLACKBERRY)
    return QLatin1String("blackberry");
#Elif defined(Q_OS_IOS)
    return QLatin1String("ios");
#Elif defined(Q_OS_MAC)
    return QLatin1String("osx");
#Elif defined(Q_OS_WINCE)
    return QLatin1String("wince");
#Elif defined(Q_OS_WIN)
    return QLatin1String("windows");
#Elif defined(Q_OS_LINUX)
    return QLatin1String("linux");
#Elif defined(Q_OS_UNIX)
    return QLatin1String("unix");
#else
    return QLatin1String("unknown");
#endif
}
33
Yash

できるよ

#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
31
user1527227

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

#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の配列を宣言するか、重複するケースを持つスイッチを使用することができます。つまり、実行時ではなくコンパイル時でエラーを生成します

12
Ajay

使用するコンパイラに依存します。

たとえば、Windowsの定義はWIN32または_WIN32になります。

また、Linuxの定義はUNIXまたは__unix__またはLINUXまたは__linux__にできます。

11
Igor Oks

コンパイラに依存します。たとえば、LinuxではG ++、WindowsではVC++でコンパイルすると、次のようになります。

#ifdef linux
    ...
#Elif _WIN32
    ...
#else
    ...
#endif
6
user703016

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

2
Vitor