形式:
#define 宏名(参数列表) 字符串
如此宏便可以传入实数灵活应用。在进行字符串替换后,会进行实参替换。
由于仍然是宏定义,所以实参替换仍是在预处理阶段进行,不会进行任何加工,判断,检查。
宏名和参数列表之间不可有空格,参数列表中可以有。
注意宏函数易产生歧义,所以尽量应用括号;
eg:
#define p1(a) a*a
#define p2(a) ((a)*(a))
int main()
{
int b,a=1;
b=p1(9+a);
printf("%d"b);
b=p2(9+a);
printf("%d"b);
}
两次输出不同,第一次输出19,第二次输出100。
第一次原样代换成9+19+1结果为19,第二次代换为(9+1)(9+1)结果为100
用#undef仍可以结束宏函数作用域,使用形式:#undef 宏函数名
宏函数的形参不可指明数据类型,不然报错。
注意在宏函数中不可实现递归
宏函数可以使用一些特殊符号灵活运用,或使其目的明显。
eg:续行符\
#define max(a,b) /
(a>b)?a:b
//相当于#define max(a,b) (a>b)?a:b
##符号
可以将两个字符串进行连接并去掉##两边的空格。
#符号
将后面的宏参数进行字符串化操作,即在两边加上双引号并进行实参代换参数。
eg:
#define p(n) printf("p"#n"=%d",p##n);
int main()
{
int p1=100;
p(1)//相当于printf("p""1""=%d",p1);
return 0;
}
输出p1=100