C语言宏定义的使用

本文详细介绍了C语言中的宏定义,包括如何定义常量和函数,以及C99标准中关于可变参数的使用。并通过实例展示了宏在处理条件语句时的注意事项和字符串化运算符的应用。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值