动机
前几天看到一个面试题:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个,里面提到两个题目考察点:
- 懂得在宏中小心地把参数用括号括起来
- 宏的副作用,例如:当你写下面的代码时会发生什么事? least = MIN(*p++, b);
平时也会用到宏定义,对于宏的理解还不特别深入,重新看了Kernighan的C程序设计语言中关于宏部分,特次记录.
宏定义的本质
#define 名字 替换文本
宏的本质是代码替换,也就是很长一个代码,起一个简单的名字来使用,在编译过程中会将这部分长代码替换简短的名字.
宏定义的优点与劣势
优点:
- 提高了程序的可读性,同时也方便进行修改;
- 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率;
- 宏是由预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。比如##连接符。
备注: ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法