一、宏定义
1.格式为 #define 宏名 常量,通常情况下宏名为大写。
使用宏定义,我们需要知道它是一个原样替换,下面这个示例会帮你明白宏定义的使用规则:
#include <stdio.h>
#define NUM 3+3
int main()
{
printf("%d\n",NUM*NUM);
return 0;
}
是你心中的那个答案吗?
在linux操作系统下,可以使用gcc -E 文件名.c -o 文件名.i 来生成预编译结果,vim 文件名.i 可以进入查看,翻到最下面,我们来看一下它预编译后的结果:
可以看到,宏定义只是将原有的常量替换宏名,并没有做任何的计算,6*6=36的结果是不存在的!
二、宏函数
1.顾名思义,就是在宏定义中实现了一个函数的功能,来看下面这个宏函数,实现的是一个相加的功能,将ADD后的参数,赋给了后面这个表达式,在这段代码中x = 5*5,然后将5*5传递给了后面的表达式,结果为5*5+5*5 = 50。注意前面是x,后面参数也需要一致,不然会报错。
#include <stdio.h>
#define ADD(x) (x+x)
int main()
{
printf("%d\n",ADD(5*5));
return 0;
}
再来看一下预编译后的结果:
没有问题。
三、字符串转化运算符#
在编写宏函数的时候,我们可能需要将宏定义的参数转化为字符串,这时候就要用到转化运算符'#',来看示例:
#include <stdio.h>
#define ADD(x) printf("得到的运算式为"#x"=%d\n",x);
int main()
{
ADD(5+5);
return 0;
}
注意,#x是在" "的外面,而不是两个'' "的中间。
四,不定参数宏
C99标准中规定,允许用户定义有省略号的宏。__VA_ARGS__,它表示可变参数列表。
#include <stdio.h>
#define dis(...) printf(__VA_ARGS__)
//#define dis(format,...) printf(format,__VA_ARGS__)
//#define dis(format,...) printf(format,##__VA_ARGS__)
int main()
{
dis("Hello world\n");
return 0;
}
上面的我一共写了三种宏定义,第一种的话没什么可说的;第二种的很明显可变参数在逗号的后面,所以我们需要有格式的固定,使用dis宏定义的时候里面也应该有逗号,不然就会报错。第三种的话则可以避免第二种的问题,如果定义的宏有格式,但是没有去按照要求去写,依旧可以正常运行,避免了语法错误。
总结:初学者的话上面的宏前两种是需要知道的,后面两种看的话了解一下即可。