C 语言宏定义的使用
1、宏定义一个常数
格式: #define 宏名 常量功能:宏名代替常量,做到见名知意
#include<stdio.h>
#define M 100
int main(){
printf("%d\n",M);
return 0;
}
2、宏定义一个函数
特点:宏都是原样替换
#include<stdio.h>
#define M 10
#define CALA(x) (x*x)
int main(){
printf("%d\n",CALA(M+M));//M+M*M+M
//10+10*10+10=120
return 0;
}
输出结果为:
120
#include<stdio.h>
void print_demo_first()
{ printf("demo first\n");
}
void print_demo_second()
{ printf("demo second\n");
}
void print_demo_third(){
printf("demo second\n");
}
#define TEST() printDemo1();printDemo2();//宏定义一个函数,调用两个函数
int main(){
TEST();
return 0;
}
改变代码架构,若是存在 if…else 语句调用则会出错。
#include<stdio.h>
void print_demo_first()
{ printf("demo first\n");
}
void print_demo_second()
{ printf("demo second\n");
}
void print_demo_third(){
printf("demo second\n");
}
#define TEST() print_demo_first();print_demo_second();//宏定义一个函数,调用两个函数
int main(){
int n = 0;
printf("please input a data : ");
scanf("%d",&n);
if(n % 2 == 0) //这没加{}
TEST();/**print_demo_first();
print_demo_second();
*/
else
print_demo_third();
return 0;
}
报错
error: ‘else’ without a previous ‘if’
else print_demo_third();
解决方案: 使用 do…while 语句防止编译出错。
注: 宏定义中do…while 的 while 后面不能加;(分号)
#include<stdio.h>
void print_demo_first()
{ printf("demo first\n");
}
void print_demo_second()
{ printf("demo second\n");
}
void print_demo_third(){
printf("demo second\n");
}
// \表示换行
#define TEST() do{\
print_demo_first();\
print_demo_second();\
}while(0)
int main(){
int n = 0;
printf("please input a data : ");
scanf("%d",&n);
if(n % 2 == 0)
TEST();
else
print_demo_third();
return 0;
}
#我们常称为字符串化运算符,因为它会把宏调用时的实参转换为字符串。
#include<stdio.h>
#define FUN(x) printf(#x "= %d\n",x)
int main(){
FUN(4+2);
return 0;
}
扩展
C99标准中规定允许用户定义有省略号的宏,省略号必须放在参数列表的后面,以表示可选参数。你可以用可选参数来调用这类宏。在代码中用…代表。他们被保存到__VA_ARGS__
中__VA_ARGS__
: 用于在宏替换部分中,表示可变参数列
#include<stdio.h>
#define FUN(...) printf(__VA_ARGS__)
int main(){
FUN("%d%s\n",4+2,"RMB");
return 0;
}
输出结果:
6RMB