我正在编写一个跨平台的代码,它应该可以在Linux、Windows和Mac OS上编译。在Windows上,我必须支持Visual Studio和MinGW。
有些平台特定的代码,我需要将其放置在#ifdef .. #endif
的环境下。例如,在这里我放置了Win32特定的代码:
#ifdef WIN32
#include <windows.h>
#endif
但是我该如何识别Linux和macOS? 我应该使用哪些定义名称(或其他内容)?
我正在编写一个跨平台的代码,它应该可以在Linux、Windows和Mac OS上编译。在Windows上,我必须支持Visual Studio和MinGW。
有些平台特定的代码,我需要将其放置在#ifdef .. #endif
的环境下。例如,在这里我放置了Win32特定的代码:
#ifdef WIN32
#include <windows.h>
#endif
但是我该如何识别Linux和macOS? 我应该使用哪些定义名称(或其他内容)?
__APPLE__
是否区分 macOS 和 iOS? - gman__APPLE__
适用于 OS X 和 iOS。您可以在 #ifdef __APPLE__
中包含 <TargetConditionals.h>
,然后您就可以使用 TARGET_OS_IPHONE #define
。 - Ted Mielczarek__MINGW64__
,因此认为在 Windows/MSVC 中提及 _MSC_VER
值得一提(它也可以用于检查 MSVC 版本)。 - ideasman42__MINGW64__
并非 MinGW-w64 作者所认可的,相反,您应该检查是否定义了 __MINGW32__
,#include <_mingw.h>
,并检查 __MINGW64_VERSION_MAJOR
。 - rubenvb参见:http://predef.sourceforge.net/index.php
该项目为许多操作系统、编译器、语言及平台标准以及标准库提供了相当全面的预定义#define
列表。
这是我使用的:
#ifdef _WIN32 // note the underscore: without it, it's not msdn official!
// Windows (x64 and x86)
#elif __unix__ // all unices, not all compilers
// Unix
#elif __linux__
// linux
#elif __APPLE__
// Mac OS, not sure if this is covered by __posix__ and/or __unix__ though...
#endif
编辑:尽管上述方法可能适用于基础操作,但请记住通过查看Boost.Predef参考页面来验证您要检查的宏。或者直接使用Boost.Predef。
#if
询问是否定义,其他的则测试值。我认为如果使用 #elif defined(__unix__)
等方式会更加一致。 - leonbloy
_WIN32
而不是WIN32
。https://dev59.com/62ox5IYBdhLWcg3wtmY1 - Melebius