带参数的宏
在某些情况下,使用带参数的宏可以在程序预处理阶段生成内联代码[1],避免由于函数调用带来的额外开销。而作为副作用,最终生成的代码可能会大于使用函数的程序。所以,在使用带参数的宏之前往往需要考虑是否需要。由于带参数的宏的本质还是在程序预处理过程时进行字符串的替换,因此需要注意以下几点:
- 在定义宏名字的时候,宏的名字中不能有空格,但是在替代字符串中可以使用空格。ANSIC允许在参数列表中使用空格。由于有些编译器要求宏定义在一行中,而宏函数较长,可以在行末回车符前用‘\’[2]连接下一行。
#define SQR(a) \
((a)*(a))
- 为每个参数和宏的整体定义加圆括号,确保宏展开后仍然正确。
#define SQR(a) ((a)*(a))
b = SQR(m + 2);
-
用大写字母表示宏函数名。由于使用带参数的宏可能出现问题,因此将宏函数大写可以提醒我们使用它们有可能带来的错误。
-
使用宏函数不需要检查变量类型,对于实现简单功能的函数较为方便。
#define SQR(X) ((X)*(X))
int a = 3;
int b = SQR(a);
float c = 2.3;
float d = SQR(c);
网友评论