GCD Inside: GCD 宏
1.GCD Inside: GCD 数据结构
2.GCD Inside: GCD 宏
1 __OBJC__
__OBJC__
宏的定义在 GCD 源码中找不到,它定义在 LLVM 的源码中:
// initPreprocessor.cpp static void InitializeStandardPredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder) { ... // 1. 定义 __OBJC__ if (LangOpts.ObjC) Builder.defineMacro("__OBJC__"); ... }
上面代码是 LLVM 前端,也就是 Clang 的源码。
代码注释 1 可以看到,Clang 在编译源文件时,如果发现处理的是 OC 源文件,会定义这个宏。
2 、__OBJC2__
__OBJC2__
宏的定义在 GCD 源码中找不到,它定义在 LLVM 源码中:
// initPreprocessor.cpp static void InitializeStandardPredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder) { ... if (LangOpts.ObjC) { // 1. 定义 __OBJC2__ if (LangOpts.ObjCRuntime.isNonFragile()) { Builder.defineMacro("__OBJC2__"); ... } ... } ... }
代码注释 1 可以看到当 Clang 编译 OC 语言,并且函数isNonFragile
返回true
时会定义__oBJC2__
。
函数isNonFragile
的定义如下:
// ObjCRuntime.h bool isNonFragile() const { switch (getKind()) { ... case iOS: return true; case WatchOS: return true; } llvm_unreachable("bad kind"); }
从代码可以看到,在 iOS 和 WatchOS 下,函数isNonFragile
返回true
。
因此,__OBJC__
__OBJC2__
在 iOS OC 环境下都会定义。
3 OS_OBJECT_HAVE_OBJC_SUPPORT
定义了__OBJC__
宏,并且在 iOS >= 6.0 以上的系统会定义这个宏。
4 OS_OBJECT_USE_OBJC
只要定义了OS_OBJECT_HAVE_OBJC_SUPPORT
宏,就会定义这个宏。
5 __swift__
在 Swift 环境下定义。
6 OS_OBJECT_SWIFT3
在 Swift 环境下定义,定义如下:
// os/object.h #ifndef OS_OBJECT_SWIFT3 #ifdef __swift__ #define OS_OBJECT_SWIFT3 1
但是在 GCD 源码文件 src/internal 中,即使在 OC 环境下也会将这个宏定义为 1:
#if USE_OBJC #define OS_OBJECT_HAVE_OBJC_SUPPORT 1 #if defined(__OBJC__) #define OS_OBJECT_USE_OBJC 1 // Force internal Objective-C sources to use class-visible headers // even when not compiling in Swift. #define OS_OBJECT_SWIFT3 1
7 __cplusplus
在 C++ 环境下定义,因为 OC 环境下可以运行 C++ 代码,因此 OC 环境下,__cplusplus
也会定义。
8 OS_OBJC_INDEPENDENT_CLASS
OS_OBJECT_USE_OBJC
定义为 1 的情况下,并且编译器支持objc_independent_class
属性,则OS_OBJC_INDEPENDENT_CLASS
的定义如下:
#define OS_OBJC_INDEPENDENT_CLASS __attribute__((objc_independent_class))
否则,这个宏的定义为空:
#define OS_OBJC_INDEPENDENT_CLASS
Clang 对objc_independent_class
属性没有相关文档记录:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-11-12 Linux-0.11操作系统源码调试