mlo*_*kot 40 c c++ macos macros xcode
在阅读各种C和C++源代码时,我遇到了两个宏__APPLE__
和__OSX__
.我发现__OSX__
在各种代码中有很多用处,特别是那些来自*BSD
系统的代码.
但是,有时候我发现__OSX__
仅仅测试是不够的,我必须用__APPLE__
宏来完成测试.
该移植Unix命令行工具到Mac OS X引导指定__APPLE__
,此外__APPLE_CC__
但没有提及__OSX__
.
- 使用
#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__
区分苹果特定代码.
scr*_*avy 10
使用
\n#if defined(__APPLE__) && defined(__MACH__)\n
Run Code Online (Sandbox Code Playgroud)\n来区分苹果操作系统。
\n您可以进一步使用TARGET_OS_MAC
和TARGET_OS_IPHONE
来区分 macOS 和 iOS。
完整示例:
\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\n一些编译器宏的在线列表(例如这个)列出了
\n__MACOSX__
. 一些论坛评论(比如这些)声称__OSX__
存在。这些都是不正确的。OSX 编译器没有预定义此类宏,但它们可能由特定项目 Makefile 和平台检测器脚本(如 GNU autoconf)定义。
更新 \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我通常用__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)
#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。