带参数的宏
带参数的宏(也称为函数式宏)的定义有如下格式:
#define 标识符(x1, x2, x3,......,xn) 替换列表
使用带参数的宏替代真正的函数有两个优点:
- 程序可能会稍微快些
- 宏更“通用”
带参数的宏也有一些缺点:
- 编译后的代码通常会变大
- 宏参数没有类型检查
- 无法用指针指向一个宏
- 宏可能会不止一次地计算它的参数
#运算符将宏的一个参数转换为字符串字面量。它仅允许出现在带参数的宏的替换列表中。
##运算符可以将两个记号(如标识符)“粘合”在一起,称为一个新记号。
宏可以使用#undef指令“取消”定义。取消现有宏的定义,以便重新给出新的定义。
对于在一个宏定义中哪里要加圆括号有两条规则要遵守:
- 首先,如果宏的替换列表中有运算符,那么始终要将替换列表放在括号中
- 其次,如果宏有参数,每个参数每次在替换列表中出现时都要放在圆括号中