如何从预处理器macros中识别平台/编译器?
我正在编写一个跨平台的代码,它应该在linux,windows,Mac OS上编译。 在windows上,我必须支持visual studio和mingw。
有一些平台特定的代码,我应该放在#ifdef .. #endif
环境中。 例如,在这里我放置了win32特定的代码:
#ifdef WIN32 #include <windows.h> #endif
但是,我如何识别Linux和Mac OS? 什么是定义名称(或其他)我应该使用?
对于Mac OS :
#ifdef __APPLE__
对于Windows上的MingW :
#ifdef __MINGW32__
对于Linux :
#ifdef __linux__
对于其他Windows编译器,请查看此线程以及其他几个编译器和体系结构。
请参阅: http : //predef.sourceforge.net/index.php
该项目为许多操作系统,编译器,语言和平台标准以及标准库提供了预定义的#defines
的合理综合列表。
以下是我使用的:
#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参考页来validation要检查的macros。 或者直接使用Boost.Predef。
如果你正在编写C ++,我不能推荐使用Boost库。
最新的版本(1.55)包括一个新的Predef库,它涵盖了您正在寻找的内容 ,以及其他几十个平台和体系结构识别macros。
#include <boost/predef.h> // ... #if BOOST_OS_WINDOWS #elif BOOST_OS_LINUX #elif BOOST_OS_MACOS #endif