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属性没有相关文档记录:

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值