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

GCD Inside: GCD 宏的更多相关文章
- HDU 5726 GCD 区间GCD=k的个数
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 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 ...
- UESTC 923 稳住GCD DP + GCD
定义:dp[i][j] 表示 在前i个数中,使整个gcd值为j时最少取的数个数. 则有方程: gg = gcd(a[i],j) gg == j : 添加这个数gcd不变,不添加, dp[i][j] ...
- 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 ...
- UVa 12716 (GCD == XOR) GCD XOR
题意: 问整数n以内,有多少对整数a.b满足(1≤b≤a)且gcd(a, b) = xor(a, b) 分析: gcd和xor看起来风马牛不相及的运算,居然有一个比较"神奇"的结论 ...
- 【CodeForces 803 C】Maximal GCD(GCD+思维)
You are given positive integer number n. You should create such strictly increasingsequence of k pos ...
- FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2224 同hdu5869 //#pragma comment(linker, "/STACK:1024 ...
- UVA 11827 Maximum GCD【GCD,stringstream】
这题没什么好说的,但是输入较特别,为此还WA了一次... 题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge& ...
- 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 ...
- HDU - 6025 Coprime Sequence(前缀gcd+后缀gcd)
题意:去除数列中的一个数字,使去除后数列中所有数字的gcd尽可能大. 分析:这个题所谓的Coprime Sequence,就是个例子而已嘛,题目中没有任何语句说明给定的数列所有数字gcd一定为1→_→ ...
随机推荐
- 2021-7-29 MySql进阶
Alter的使用: 列的增加和删减 alter table users add user_name VARCHAR(100);#添加一列在末尾 SELECT * from users; alter t ...
- RedHat8静默安装was
前言 was(websphere application server),类似weblogic.tomcat,由IBM开发的一种企业级Java容器. 系统版本:redhat 8.2 was版本:was ...
- TRL 正式推出,来训练你的首个 RLHF 模型吧!
我们正式向大家介绍 TRL--Transformer Reinforcement Learning.这是一个超全面的全栈库,包含了一整套工具用于使用强化学习 (Reinforcement Learni ...
- Android源码-生成系统签名文件
一.生成keystore签名文件 android 源码目录build\target\product\security 取platform.pk8 platform.x509.pem放到一个目录下 生成 ...
- [htmlayout] csss! 改变值/文本
<input type="text" value="123" /> <div class="test">内容内容&l ...
- 【算法】湖心岛上的数学梦--用c#实现一元多次方程的展开式
每天清晨,当第一缕阳光洒在湖面上,一个身影便会出现在湖心小岛上.她坐在一块大石头上,周围被茂盛的植物环绕,安静地沉浸在数学的世界中. 这个姑娘叫小悦,她的故事在这个美丽的湖心小岛上展开.每天早晨,她都 ...
- 4-MySQL数据库的常用操作
在MySQL数据库中,增删改查操作是指对数据进行添加.删除.查询和修改的操作.这些操作在数据库管理和维护中非常重要,可以帮助数据库管理员和开发人员有效地管理数据和实现各种复杂的数据处理需求. 添加数据 ...
- 关于使用uniapp时Android 离线打包的注意事项
Android 离线打包 文档地址: https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android 注意事项: 添加权限,需要将 uniapp ...
- 【RocketMQ】Rebalance负载均衡总结
消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者 ...
- PostgreSQL学习笔记-1.基础知识:创建、删除数据库和表格
PostgreSQL 创建数据库 PostgreSQL 创建数据库可以用以下三种方式:1.使用 CREATE DATABASE SQL 语句来创建.2.使用 createdb 命令来创建.3.使用 p ...