参考博客:https://mp.weixin.qq.com/s/qTFLZFL2IAz1ScrV1u313Q
宏分为两种:Object-like 宏和Function-like 宏
Object-like 宏:
1、在宏定义时,通常宏的名称都是用大写字母表示,如果要换行就在行末使用\断行。
2、在调用宏时,预处理器在替换宏的内容时会继续检查宏的内容本身是否也是宏定义,如果是,会继续替换宏定义的内容,直到全部展开。
3、宏定义以最后有效的定义为准。
例如:
#define M_PI 3.14159265358979323846264338327950288
#define MAX(a,b) ((a)>(b)?(a):(b))
#undef 宏名称:可以取消宏定义。
Function-like 宏:
1.在“()”里可以添加参数,以“,”分隔
2.使用 “#” 预处理操作符来实现将宏中的参数转化为字符(串),这个操作会将参数中的所有字符都实现字符(串)化,包括引号,如果参数中间有很多空格,字符(串)化之后将会只用一个空格代替。
3.使用 “##” 操作符可以实现宏中token的连接
可变参数的宏:__VA_ARGS__
__VA_ARGS__:总体来说就是将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的。
例如:
#define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); }
可以用来把block调用的参数传递过去;