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
屬性沒有相關文件記錄: