不带参数的宏定义
1.宏定义指令#define用来定义一个标识符和一个字符串,以这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。宏定义的作用就是给指定的字符串起个别名,下面是不带参数的宏定义一般形式:
#define 宏名 字符串
#define PI 3.14159
该语句作用是用PI替代3.14159,在编译源程序过程中遇到PI就替换为3.14159.
宏定义的好处:比如要替换程序中的某个常量时,只需改变#define命令行,整个程序的常量都会改变,大大提高了程序的灵活性。(宏定义不是C语言,不需要在末尾加分号。)
2.如果在串中含有宏名,则不进行宏替换
#include<stdio.h>
#define LOL "this is a game"
main()
{
char Exp[30]="This LOL is not that LoL";
printf("%s\n,Exp");
}
上面的LOL并没有用 This LOL is not that LOL来代替
可以用#undef命令来终止宏定义的作用域。
宏定义用于预处理命令,它不同于定义的变量,只做字符替换,不分配内存空间。
2.带参数的宏定义
#define 宏名 (参数表)字符串 //注意宏名与带参数的括号之间不可以加空格
#include<stdio.h>
#define MIX(a,b) ((a)*(b)+(b)) /*宏定义求两个数的混合运算*/
main()
{
int x=5,y=9;
printf("x,y:\n");
printf("%d,%d\n",x,y);
printf("the min number is:%d\n",MIX(x,y)); /*宏定义调用*/
}
好处:提升代码速度,因为不存在调用函数 缺点:重复编码,代码冗长。
注意事项:1、宏定义时参数要加上括号,不加结果可能正确也可能错误
例如:x=2,y=1+2 MIX(x,y),输出结果与想要结果就不符合
2、宏扩展必须用括号来保护表达式中低优先级的操作符,以确保调用时不会出错
例如:调用MIX(x,y),MAX(x,y)不加括号会变成 5*(a)*(b)+(b)而希望得到
5*((a)*(b)+b))