ios中宏的使用注意点
前言:
不得不说在C系语言(C, Objective-C, C++.。。)中宏(macro)是个强大的东西, 虽然在基本的语法上面看上去是非常的简单, 不过有时候正因为他的强大和方便, 就会导致在使用的时候, 其中会有很多的注意点, 如果不小心被忽略, 那么将会带来完全不想要的结果。 所以要想灵活的使用它, 那么还是先了解一些比较好。 而且在iOS开发中如果你是使用OC, 那么你可能经常会使用到#define(swift当前不支持宏)
首先扔出几个宏的定义,调用这些宏的时候分别是什么结果, 看看你能够在不看后面的情况下, 清楚多少, 当然, 如果很清楚, 自然可以忽略后文的八卦了。。., 因为, 你绝对比我更了解宏。。.
1. #define PI 3.14
2. #define log(x) printf(“this is test: x = %d”, x)
3. #define log(x) printf(“this is test: ”#x“ = %d”, x)
4. #define power(x) x*x
5. #define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]
6. #define print(。。.) printf(__VA_ARGS__)
7. #define RGB(r, g, b) {\
RGBA(r, g, b, 1.0f);\
}
8. #define weakify( x ) autoreleasepool{} __weak typeof(x) weak##x = x;
9. #define weakify(。。.) \ autoreleasepool {} \ metamacro_foreach_cxt(rac_weakify_,, __weak, __VA_ARGS__)
这里先不解释上面定义的几个宏了, 首先介绍下宏的一些基本东西
程序第一步是在预编译之前会有一些操作, 例如删除反斜线和换行符的组合, 将每个注释用一个空格替代。。.
然后在进入预编译的时候, 会寻找可能存在的预处理指定(由#开头), 例如C中常用的#include, 或者oc中的#import, #define.。。很多(条件编译语句。。.)
处理#define的时候,然后预处理器会从#开始, 一直到执行到第一个换行符(写代码的时候换行的作用), 自然, #define只会允许定义一行的宏, 不过正因为上面提到的预处理之前会删除反斜线和换行符的组合, 所以可以利用反斜线定义多行宏, 在删除反斜线和换行符的组合后, 逻辑上就成了一行的宏了
宏作用在预编译时期, 其真正的效果就是代码替换, 而且是直接替换(内联函数!!!), 这个和函数有着很大的区别, 并且正因为是直接替换, 在使用的时候就会有一些的注意点了, 这个在后面会给出例子
宏可以被称为 类对象宏, 类函数宏(开篇给的几个宏中都已经囊括了这两类)
定义宏的语法很简单, 一个宏定义由三部分组成 , 三分部之间用空格分开, #define, 宏的名字, 主体 例如第一个宏#define PI(宏的名字) 3.14(主体), 这里有个注意点就是, 宏的命名和普通的变量命名规则相同
宏在预处理阶段只进行文本的替换(相当于把代码拷贝粘贴), 不会进行具体的计算(发生在编译时期)
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%
下载地址
ios中宏的使用注意点下载
相关电子资料下载
- iOS17.1可能明天发布,iOS17.1主要修复哪些问题? 377
- 华为全新鸿蒙蓄势待发 仅支持鸿蒙内核和鸿蒙系统应用 719
- 苹果手机系统iOS 17遭用户质疑 731
- iPhone12辐射超标?苹果推送iOS 17.1解决此事 750
- rthread记录一次编译报错:undefined reference to `rt_strcmp' 97
- 传华为囤积零部件 目标明年智能手机出货7000万部;消息称 MiOS 仅限国内,小米 28208
- 苹果推送iOS17.0.3,解决iPhone15Pro系列存在机身过热 216
- Testin云测兼容和真机服务平台中上线iPhone 15系列手机 208
- 利尔达推出搭载HooRiiOS的Matter模组 145
- 运放参数解析:输入偏置电流(Ibias)和失调电流(Ios) 128