'#'
’#”作用是将宏参数变为一个字符串(#define 在预处理时将宏参数替换);
例如:
#define N 1 //我们常常把宏参数用大写符号表示,以增加程序的可读性;
printf("%d",N);
输出结果为1;
但是如果是以下代码:
#define N 1
printf("%d",N1);
则不会输出11; //宏参数并不会将字符串中的N替换为1,因为N1是一个整体;
ps:可以使用#undef中断宏函数的替换;
宏参数本身也可以自带参数
例如:
#define S(a) 1
printf("%d",S(a); //a是变量;
利用这一点可以写出以下代码:
#define MAX(a,b) (a>b?a:b)
printf("%d",MAX(1,9));
当然我们也可以使用函数:
int MAX(int a,b)
{
printf("%d",(a>b?a:b));
}
此时宏函数的优点就体现出来了:
- 可以不用事先定义变量类型;
- 因为宏函数是在预处理时将宏参数替换为字符串,所以不需要开辟栈空间,从而使程序更加高效;
当然宏函数的缺点也十分明显:
宏是没法调试的,编译器不会检查参数的合法性,所以容易出错;
除此之外还有一些宏函数可以做到但函数无法做到的事:
例如打印任意变量类型的长度:
这种问题使用宏函数可以轻松完成: //利用宏函数不需要事先声明变量名的特性;
#define S(a) (printf("%d\n",sizeof(a))
S(int);
S(double):
输出: 4
8
‘##’的作用是把两个宏参数贴合在一起;
例如:
#define S(a,b) (a#e#b) //参数可以为表达式,但是为了防止受到运算符优先级的影响我们常常加上()
printf("%d",S(1,3));
输出:1000;
ps:宏函数无法被嵌套,也无法递归;

浙公网安备 33010602011771号