在Windows和Linux上编译C ++:ifdef switch

我想在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 

这个问题确实是重复的,但这里的答案要好得多,尤其是被接受的答案。

使用:

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

我知道这不是答案,但添加如果有人在Qt中相同

在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 

macros可以在哪里:

  __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 

这个回应不是关于macros观战争,而是如果没有find匹配的平台,就会产生错误。

 #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上。 看到这个线程的更多信息。