ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在编写一个跨平台代码,它应该在 linux、windows、Mac OS 上编译。在windows上,我必须支持visual studio和mingw。

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

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

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

骗子有一个更好接受的答案。
建议的副本不是同一个问题。这个问题只询问识别操作系统,而这个问题还询问识别编译器,这是一个非常不同的事情。
@JBentley 但接受的答案甚至没有提到编译器,只谈论操作系统(和一个“平台”)。更不用说相对于受骗者必须提供的东西,这是一个糟糕的答案。
@rubenvb 然后将另一个问题链接为评论。仅仅因为它有一个更好的答案,并不会使其重复。问题是什么决定了它是否是重复的,而不是答案。关闭这个只能确保我们永远不会得到与编译器相关的问题的高质量答案,所谓的“重复”永远无法回答。

C
Community

对于 Mac 操作系统:

#ifdef __APPLE__

对于 Windows 上的 MingW:

#ifdef __MINGW32__

对于 Linux:

#ifdef __linux__

对于其他 Windows 编译器,请检查 this threadthis 以了解其他几个编译器和体系结构。


__APPLE__ 是否区分 OSX 和 iOS?
__APPLE__ 为 OS X 和 iOS 设置。您可以在 #ifdef __APPLE__ 中使用 #include <TargetConditionals.h>,然后它会为您提供 TARGET_OS_IPHONE #define
__MINGW64__ 在使用 mingw64 时也可用
由于引用了 __MINGW64__,因此认为 Windows/MSVC 的 _MSC_VER 值得一提(也可用于检查 MSVC 版本)。
很抱歉,但这个答案在所有方面都非常不正确,甚至没有回答这个问题。
J
John Bartholomew

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

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


从 1.55 版开始,Predef 现在包含在 Boost C++ Libraries 中。
我知道您发布此帖子时规则有所不同,但我将不得不要求您编辑此帖子以包含更多相关细节。现在,我们强烈建议您不要只使用一天链接的答案,我想为您提供在删除之前保存此帖子的机会。
由于这是真正回答标题中所述问题的唯一答案,而且这个问题非常笼统和相关,我强烈建议不要删除它。我也不会称其为“仅链接”答案。
@0x7fffffff:将其他答案的内容复制到这个答案中对任何人都有什么好处?如果您认为拥有一个明确的答案非常重要,那么也许您应该自己创建这样的答案(这应该不难:只需以某种合理的顺序将现有答案粘合在一起)。就我个人而言,我的时间有更好的事情要做,但作为主持人,显然 SO 对你来说比对我更重要。
r
rubenvb

这是我使用的:

#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 __ 代替,使用禁用 GNU 扩展的 GCC 编译时未定义 linux(即 -std=c++0x)
@Erbureth 已修复,但应该真正使用 predef.sourceforge.net/index.php 作为评分最高的答案。
@rubenvb:确实。而且它的票数仍然太少,我认为:) ...我已经多次转向他们的网站。
为了一致性(可能有点迂腐):第一个 #if 询问是否已定义,其他则测试价值。如果做 #elif defined(__unix__) 等会更一致,我认为。
f
foraidt

如果您正在编写 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 进行了三次评估。它无法通过评估...如果得到承认,大多数错误报告都是幸运的。缺乏承认指向工程过程中更深层次的问题。我相信预处理器宏和内置 C++ 标准库是更安全的选择。