@@ 带参数的宏,一般形式如下:
#define 宏名(参数表) 字符串
在函数中使用此宏的时候,除了进行简单的字符串替换外,还要进行参数替换。如:
#define add(x, y) x + y
z = add(a, b); /* 此句在函数内部 */
预处理后为:z = a + b;
具体查看方法就是查看预处理结果:$ gcc -E test.c -o test.i
@@ 带参数的宏与函数非常类似,在引用函数的时候也是在函数名后的括号内写参数,而且要求实参的数目/类型都要和形参相同。但是他们也是有区别的:
- 对参数的使用方法不同。函数调用时,先求出实参表达式的值,然后带入形参(注意求实参的值的顺序,栈);宏只是进行简单的字符替换。
- 处理机制不同。函数调用在程序运行时处理,且要分配内存;宏展开在编译时进行,准确的说在预处理的时候就展开了,宏不分配内存,不发生值的传递处理,也没有返回值。
- 定义时的要求不同。函数定义时,实参和形参都要注明类型;宏定义的时候不存在类型问题。
No pains, no gains!