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