哪个宏用C/C++包装Mac OS X特定代码

mlo*_*kot 40 c c++ macos macros xcode

在阅读各种C和C++源代码时,我遇到了两个宏__APPLE____OSX__.我发现__OSX__在各种代码中有很多用处,特别是那些来自*BSD系统的代码.

但是,有时候我发现__OSX__仅仅测试是不够的,我必须用__APPLE__宏来完成测试.

移植Unix命令行工具到Mac OS X引导指定__APPLE__,此外__APPLE_CC__没有提及__OSX__.

GCC指南的移植说:

  • 使用#ifdef __GNUC__封装任意GCC特定的代码.
  • 使用#ifdef __APPLE_CC__封装任意Mac OS X的特定代码.

再一次,没有提到__OSX__宏观.

在Mac OS X平台和XCode开发环境中预定义了哪些宏应该用于区分C/C++程序中的OSX特定代码?

__OSX__宏定义在哪里?是*BSD具体的宏吗?

Mar*_*ork 23

这完全取决于.

每个宏指定不同的含义.
请参阅:https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-SW13

__APPLE__

此宏在任何Apple计算机中定义.

__APPLE_CC__

此宏设置为一个整数,表示编译器的版本号.这使您可以区分,例如,基于相同版本的GCC的编译器,但具有不同的错误修复或功能.较大的值表示后来的编译器.

__OSX__

可以预测OS是OS X的特定变体

因此,鉴于上述定义,我将用于__APPLE__区分苹果特定代码.

  • 链接已过时. (2认同)

Kor*_*icz 12

这是一个很好的操作系统宏列表.

__OSX__网上的信息很少.你会安全的__APPLE__.


scr*_*avy 10

使用

\n
#if defined(__APPLE__) && defined(__MACH__)\n
Run Code Online (Sandbox Code Playgroud)\n

来区分苹果操作系统。

\n

您可以进一步使用TARGET_OS_MACTARGET_OS_IPHONE来区分 macOS 和 iOS。

\n

完整示例:

\n
#if defined(__APPLE__) && defined(__MACH__)\n    /* Apple OSX and iOS (Darwin). */\n#include <TargetConditionals.h>\n#if TARGET_IPHONE_SIMULATOR == 1\n    /* iOS in Xcode simulator */\n\n#elif TARGET_OS_IPHONE == 1\n    /* iOS */\n\n#elif TARGET_OS_MAC == 1\n    /* macOS */\n\n#endif\n#endif\n
Run Code Online (Sandbox Code Playgroud)\n

关于“从哪里来的问题__OSX__:

\n
\n

一些编译器宏的在线列表(例如这个)列出了__MACOSX__. 一些论坛评论(比如这些)声称__OSX__存在。这些都是不正确的。OSX 编译器没有预定义此类宏,但它们可能由特定项目 Makefile 和平台检测器脚本(如 GNU autoconf)定义。

\n
\n

来源: http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

\n

更新 \xe2\x80\x93 上面的链接已损坏,请参阅网络存档中的版本: https://web.archive.org/web/20180331065236/http ://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system#OSXiOSandDarwin

\n

  • 应选择该答案作为接受的答案。这也是 Swift 编译器检查操作系统是否为 mac 的方式。 (2认同)

Pau*_*l R 9

我通常用__MACH__这个。它是从 OS X 的最早版本开始定义的(甚至可能更早)。

如果您想排除可能为使用 Mach 内核的其他操作系统进行编译的可能性,那么您可以使用@scravy 的建议

#if defined(__APPLE__) && defined(__MACH__)
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您正在编译通用 C/C++ 代码,即没有 Apple 特定的标头,因此您只对预定义的编译器宏感兴趣,则可以按如下方式检查这些代码:

$ gcc -dM -E - < /dev/null | egrep -i 'os_|mac|apple'
#define __APPLE_CC__ 6000
#define __APPLE__ 1
#define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 120000
#define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 120000
#define __MACH__ 1
#define __VERSION__ "Apple LLVM 13.1.6 (clang-1316.0.21.2.3)"
#define __apple_build_version__ 13160021
Run Code Online (Sandbox Code Playgroud)

  • `__MACH__` 也用于 GNU/Hurd,因为后者当前使用 Mach 内核。 (3认同)

pre*_*ett 5

请参阅http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system#OSXiOSandDarwin

#ifdef __APPLE__
#include <TargetConditionals.h>
#if TARGET_OS_MAC
   ...
#endif /* TARGET_OS_MAC */
#endif /* __APPLE__ */
Run Code Online (Sandbox Code Playgroud)

请注意,至少在 Xcode 9 中__OSX__存在。

另请注意,事实#if TARGET_OS_MAC并非如此#ifdef。它始终被定义,但在非 macOS 时为 0。