GCD Inside: GCD 宏

chaoguo1234發表於2023-11-12

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