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
質問は確かに重複していますが、ここでの回答は、特に受け入れられているものの方がはるかに優れています。
つかいます:
#ifdef __linux__
//linux code goes here
#Elif _WIN32
// windows code goes here
#else
#endif
私はそれが答えではないことを知っていますが、誰かが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
}
できるよ
#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
この応答はマクロ戦争に関するものではありませんが、一致するプラットフォームが見つからない場合はエラーを生成します。
#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の配列を宣言するか、重複するケースを持つスイッチを使用することができます。つまり、実行時ではなくコンパイル時でエラーを生成します
使用するコンパイラに依存します。
たとえば、Windowsの定義はWIN32
または_WIN32
になります。
また、Linuxの定義はUNIX
または__unix__
またはLINUX
または__linux__
にできます。
コンパイラに依存します。たとえば、LinuxではG ++、WindowsではVC++でコンパイルすると、次のようになります。
#ifdef linux
...
#Elif _WIN32
...
#else
...
#endif
いいえ、これらの定義はコンパイラに依存しています。できること、独自の定義セットを使用し、それらをMakefileに設定します。詳細については、 this thread を参照してください。