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

GCD Inside: GCD 宏的更多相关文章

  1. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  2. UVA 1642 Magical GCD(gcd的性质,递推)

    分析:对于区间[i,j],枚举j. 固定j以后,剩下的要比较M_gcd(k,j) = gcd(ak,...,aj)*(j-k+1)的大小, i≤k≤j. 此时M_gcd(k,j)可以看成一个二元组(g ...

  3. UESTC 923 稳住GCD DP + GCD

    定义:dp[i][j] 表示 在前i个数中,使整个gcd值为j时最少取的数个数. 则有方程: gg = gcd(a[i],j) gg == j : 添加这个数gcd不变,不添加,  dp[i][j] ...

  4. UVa 11426 (欧拉函数 GCD之和) GCD - Extreme (II)

    题意: 求sum{gcd(i, j) | 1 ≤ i < j ≤ n} 分析: 有这样一个很有用的结论:gcd(x, n) = i的充要条件是gcd(x/i, n/i) = 1,因此满足条件的x ...

  5. UVa 12716 (GCD == XOR) GCD XOR

    题意: 问整数n以内,有多少对整数a.b满足(1≤b≤a)且gcd(a, b) = xor(a, b) 分析: gcd和xor看起来风马牛不相及的运算,居然有一个比较"神奇"的结论 ...

  6. 【CodeForces 803 C】Maximal GCD(GCD+思维)

    You are given positive integer number n. You should create such strictly increasingsequence of k pos ...

  7. FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2224 同hdu5869 //#pragma comment(linker, "/STACK:1024 ...

  8. UVA 11827 Maximum GCD【GCD,stringstream】

    这题没什么好说的,但是输入较特别,为此还WA了一次... 题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge& ...

  9. luoguP2398 GCD SUM [gcd]

    题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入格式: n 输出格式: sum ...

  10. HDU - 6025 Coprime Sequence(前缀gcd+后缀gcd)

    题意:去除数列中的一个数字,使去除后数列中所有数字的gcd尽可能大. 分析:这个题所谓的Coprime Sequence,就是个例子而已嘛,题目中没有任何语句说明给定的数列所有数字gcd一定为1→_→ ...

随机推荐

  1. Redis 备忘录

    redis是什么 Redis 是一个高性能的key-value数据库 常用操作 下载 官网:https://redis.io/ Linux版:https://redis.io/download Win ...

  2. 如何在 Windows Server 2022 阿里云服务器上搭建自己的 MQTT 服务器之二Mosquitto服务器

    一.介绍 最近几天都在搭建MQTT服务器,几天前搭建好了一个 Apache-Apollo的 MQTT 服务器,当我们在管理我们的主题的时候,发现主题的名称的斜杠(/)变成了点号(.),正好我在调试程序 ...

  3. TypeScript:Type 'boolean' is not assignable to type 'never'.

    问题原因 当我们声明一个空数组而不显示键入它并尝试向其中添加元素时,会发生该错误. 解决方案 声明数组类型即可 参考链接 https://bobbyhadz.com/blog/typescript-a ...

  4. 从ABNF读懂HTTP协议格式

    定义 HTTP(Hyper Text Transfer Protocol)超文本传输协议 HTML( Hyper Text Markup Language)超文本标记语言 URI(Uniform Re ...

  5. ATtiny88初体验(二):呼吸灯

    ATtiny88初体验(二):呼吸灯 前面的"点灯"实验实现了间隔点亮/熄灭LED,但是间隔时间和亮度都没法控制,为了解决这个问题,可以使用ATtiny88的定时器模块. ATti ...

  6. 14.4K Star,一款外观漂亮、运行快速、动画细腻的开源免费UI组件库

    之前给大家推荐了很多后台模版,有读者希望推荐一些跟通用的好看组件,毕竟出了后台还有很多其他场景嘛.所以,今天继续给大家推荐一个广受好评的UI组件库:NextUI 主要特性 NextUI的主要目标是简化 ...

  7. mac安装mysql8.0

    1.进入下载页 历史版本:https://downloads.mysql.com/archives/community/ 最新版本:https://dev.mysql.com/downloads/my ...

  8. 代码随想录算法训练营第二十八天| 93.复原IP地址 78.子集 90.子集II

      93.复原IP地址 卡哥建议:本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了 题目链接/文章讲解:https://programmercarl.com/0093.%E5% ...

  9. 不关闭Tamper Protection(篡改保护)下强制卸载Windows Defender和安全中心所有组件

    个人博客: xzajyjs.cn 背景介绍 由于微软不再更新arm版本的win10系统,因此只能通过安装insider preview的镜像来使用.而能找到的win10 on arm最新版镜像在安装之 ...

  10. 给你的 SpringBoot 工程部署的 jar 包瘦瘦身吧!

    之前有写过一篇有关maven插件的文章:spring-boot-maven-plugin插件详解 一.需求背景 我们知道Spring Boot项目,是可以通过java -jar 包名 启动的. 那为什 ...