如何从预处理器宏中识别平台/编译器?

我正在编写一个跨平台的代码,应该可以在 linux,windows,Mac OS 上编译。在窗口上,我必须支持视觉工作室和 mingw。

有一些特定于平台的代码,我应该把它们放在 #ifdef .. #endif环境中。例如,我在这里放置了 win32的特定代码:

#ifdef WIN32
#include <windows.h>
#endif

但是我如何识别 linux 和 mac 操作系统呢? 我应该使用哪些定义名称(或等等) ?

121288 次浏览

见: http://predef.sourceforge.net/index.php

This project provides a reasonably comprehensive listing of pre-defined #defines for many operating systems, compilers, language and platform standards, and standard libraries.

对于 Mac OS:

#ifdef __APPLE__

对于 Windows 上的 明文:

#ifdef __MINGW32__

对于 Linux:

#ifdef __linux__

对于其他 Windows 编译器,请检查 这根线这个以查看其他几个编译器和体系结构。

以下是我的方法:

#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。直接预测。

如果您正在编写 C + + ,我不推荐使用足够强大的 加油库。

最新版本(1.55)包括一个新的 Predef库,它涵盖了 正是你想要的,以及其他几十个平台和体系结构识别宏。

#include <boost/predef.h>


// ...


#if BOOST_OS_WINDOWS


#elif BOOST_OS_LINUX


#elif BOOST_OS_MACOS


#endif