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

Are*_*nim 112 c++ macros cross-platform c-preprocessor

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

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

#ifdef WIN32
#include <windows.h>
#endif
Run Code Online (Sandbox Code Playgroud)

但是我如何识别linux和mac OS?我应该使用什么定义名称(或等)?

kar*_*lip 130

对于Mac OS:

#ifdef __APPLE__
Run Code Online (Sandbox Code Playgroud)

对于Windows上的MingW:

#ifdef __MINGW32__
Run Code Online (Sandbox Code Playgroud)

对于Linux:

#ifdef __linux__
Run Code Online (Sandbox Code Playgroud)

对于其他Windows编译器,检查此线程这个其他几个编译器和架构.

  • 为OS X和iOS设置了`__APPLE__`.你可以在`#ifdef __APPLE__`里面`#include <TargetConditionals.h>`,它会给你一个`TARGET_OS_IPHONE #define`. (14认同)
  • `__APPLE__`是否区分OSX和iOS? (2认同)
  • 当使用mingw64时,`_MINGW64__`也可用 (2认同)
  • 由于`__MINGW64__`被引用,认为`_MSC_VER`适用于Windows/MSVC值得一提的(这也可以用来检查MSVC版). (2认同)

Joh*_*mew 59

请参阅:http://predef.sourceforge.net/index.php

该项目#defines为许多操作系统,编译器,语言和平台标准以及标准库提供了相当全面的预定义列表.

  • 从版本1.55开始,Predef现在包含在[Boost C++ Libraries](http://www.boost.org/)中. (5认同)
  • @ 0x7fffffff:对于任何人来说,将其他答案的内容复制到这个中会有什么好处?如果你认为有一个明确的答案是非常重要的,那么也许你应该自己创造这样一个答案(这应该不难:只是按照一些合理的顺序将现有的答案粘在一起).就个人而言,我有更好的时间与我的时间有关,但作为一个主持人,显然对你来说比对我更重要. (2认同)

rub*_*nvb 45

这是我使用的:

#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
Run Code Online (Sandbox Code Playgroud)

编辑:虽然以上可能适用于基础知识,但请记住通过查看Boost.Predef参考页面来验证要检查的宏.或者直接使用Boost.Predef.

  • 使用__linux __代替,在使用禁用GNU扩展的GCC进行编译时未定义linux(即-std = c ++ 0x) (3认同)

rva*_*lue 20

如果您正在编写C++,我建议不要强烈使用Boost库.

最新版本(1.55)包括一个新的Predef库,它涵盖了您正在寻找的内容,以及许多其他平台和架构识别宏.

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif
Run Code Online (Sandbox Code Playgroud)

  • *"我不能建议强烈使用Boost库...."* - 我已经评估了Boost三次.它无法通过评估...如果被承认,大多数错误报告都是幸运的.缺乏确认意味着工程流程中存在更深层次的问题.我相信预处理器宏和内置的C++标准库是一个更安全的选择. (2认同)