'#'

’#”作用是将宏参数变为一个字符串(#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));

}

此时宏函数的优点就体现出来了:

  1. 可以不用事先定义变量类型;
  2. 因为宏函数是在预处理时将宏参数替换为字符串,所以不需要开辟栈空间,从而使程序更加高效;

当然宏函数的缺点也十分明显:

宏是没法调试的,编译器不会检查参数的合法性,所以容易出错;

除此之外还有一些宏函数可以做到但函数无法做到的事:

例如打印任意变量类型的长度:

这种问题使用宏函数可以轻松完成:                               //利用宏函数不需要事先声明变量名的特性;

#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:宏函数无法被嵌套,也无法递归; 

 

posted @ 2021-09-29 14:10  伊吹萃香  阅读(1380)  评论(0)    收藏  举报