如何从预处理器宏中识别平台/编译器?
Posted
技术标签:
【中文标题】如何从预处理器宏中识别平台/编译器?【英文标题】:How to identify platform/compiler from preprocessor macros? 【发布时间】:2011-06-04 02:23:22 【问题描述】:我正在编写一个跨平台代码,它应该在 linux、windows、Mac OS 上编译。在windows上,我必须支持visual studio和mingw。
有一些特定于平台的代码,我应该将它们放在#ifdef .. #endif
环境中。比如这里我放了win32的具体代码:
#ifdef WIN32
#include <windows.h>
#endif
但是我如何识别 linux 和 mac OS?我应该使用什么定义名称(或等)?
【问题讨论】:
这里是OS macro define list。 骗子有一个更好接受的答案。 建议的副本不是同一个问题。这个问题只问识别操作系统,而这个问题也问识别编译器,这是一个非常不同的事情。 @JBentley 但接受的答案甚至没有提到编译器,只谈论操作系统(和一个“平台”)。更不用说相对于受骗者提供的内容而言,这是一个糟糕的答案。 @rubenvb 然后将另一个问题链接为评论。仅仅因为它有一个更好的答案,并不会使其重复。问题是什么决定了它是否是重复的,而不是答案。关闭这个只能确保我们永远不会得到与编译器相关的问题的高质量答案,所谓的“重复”永远无法回答。 【参考方案1】:这是我使用的:
#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 reference pages 来验证您要检查的宏。或者直接使用 Boost.Predef。
【讨论】:
使用 __linux __ 代替,使用 GCC 编译并禁用 GNU 扩展时未定义 linux(即 -std=c++0x) @Erbureth 已修复,但应该真正使用 predef.sourceforge.net/index.php 作为评分最高的答案。 @rubenvb:确实。而且它的票数仍然太少,我认为 :) ...我已经多次访问他们的网站。 为了一致性(也许有点迂腐):第一个#if
询问是否已定义,其他测试价值。如果会更一致地做 #elif defined(__unix__)
等,我想。【参考方案2】:
如果您正在编写 C++,我不建议您足够强烈地使用 Boost 库。
最新版本 (1.55) 包括一个新的 Predef 库,其中涵盖了 exactly what you're looking for,以及许多其他平台和架构识别宏。
#include <boost/predef.h>
// ...
#if BOOST_OS_WINDOWS
#elif BOOST_OS_LINUX
#elif BOOST_OS_MACOS
#endif
【讨论】:
鉴于这是提升,该解决方案将适用于不同的平台/操作系统和不同的编译器。 “我不能推荐使用 Boost 库的力度不够……” - 我已经对 Boost 进行了 3 次评估。它无法通过评估...如果得到承认,大多数错误报告都是幸运的。缺乏承认指向工程过程中更深层次的问题。我相信预处理器宏和内置 C++ 标准库是更安全的选择。【参考方案3】:对于Mac OS:
#ifdef __APPLE__
对于 Windows 上的 MingW:
#ifdef __MINGW32__
对于 Linux:
#ifdef __linux__
对于其他 Windows 编译器,请查看 this thread 和 this 以了解其他几个编译器和架构。
【讨论】:
__APPLE__
区分 OSX 和 ios 吗?
__APPLE__
为 OS X 和 iOS 设置。您可以在#ifdef __APPLE__
中使用#include <TargetConditionals.h>
,然后它会为您提供TARGET_OS_IPHONE #define
。
__MINGW64__
在使用mingw64时也可用
由于引用了__MINGW64__
,认为Windows/MSVC的_MSC_VER
值得一提(也可以用来检查MSVC版本)。
很抱歉,这个答案在所有帐户上都完全不正确,甚至没有回答问题。【参考方案4】:
见:http://predef.sourceforge.net/index.php
该项目为许多操作系统、编译器、语言和平台标准以及标准库提供了相当全面的预定义 #defines
列表。
【讨论】:
从 1.55 版开始,Predef 现在包含在 Boost C++ Libraries 中。 我知道您发布此帖子时的规则有所不同,但我将不得不要求您编辑此帖子以包含更多相关细节。现在,我们强烈建议您不要使用仅提供一天链接的答案,并且我想为您提供在删除之前保存此帖子的机会。 因为这是真正回答标题中所述问题的唯一答案,而且这个问题非常笼统和相关,我强烈建议不要删除它。我也不会称其为“仅链接”答案。 @0x7fffffff:将其他答案的内容复制到这个答案中会对任何人有什么好处?如果您认为拥有一个明确的答案真的很重要,那么也许您应该自己创建这样的答案(这应该不难:只需以某种合理的顺序将现有答案粘合在一起)。就我个人而言,我的时间有更好的事情要做,但作为主持人,显然 SO 对你来说比对我更重要。以上是关于如何从预处理器宏中识别平台/编译器?的主要内容,如果未能解决你的问题,请参考以下文章