如何从预处理器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