c语言预处理及宏函数知识点总结

博客主页:https://blog.csdn.net/weixin_46094737?type=blog
欢迎评论⭐留言  如有错误敬请指正!
本文由小学生廉原创,首发于 CSDN🙉🙉🙉
未来很长,值得我们全力奔赴更美好的生活!💞💞💞

1、预处理定义:

C语言的预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件内容、定义和替换由#define指令定义的符号,同时确定代码的部分内容是否应该根据一些条件编译指令进行编译。

一、预定义符号
下表为C语言预处理器定义的符号。他们的值有的是字符串常量,有的是十进制数字常量。

符号示例值(注意%s、%d)含义
__ FILE__ D:\lianpan\code\0815\预处理(宏)1.c编译文件当前所在的路径
__ LINE__ 16当前代码所在行号
__ DATE__ Aug 15 2022当前代码编译日期
__ TIME__23:04:26当前代码编译时间

2、宏
#define机制包括一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或者定义宏(define macro)。下面是宏的声明方式:

#define name(parameter-list) stuff

其中,parameter-list(参数列表)是一个由逗号分隔的符号列表,它们可能出现在stuff 中。参数列表的左括号必须与name紧邻。否则,参数列表就会被解释为stuf的一部分。

当宏被调用时,名字后面是一个由逗号分隔的值的列表,每个值都与宏定义中的一个参数相对应。当参数出现在程序中时,与每个参数对应的实际值都将会被替换到stuff中。
 

#define A 110

这里需要指明的是,我们这里定义A,在后面引用A或者说用A在参与运算是,A的值都是以文本的形式进行编译,只是当我们运算时,编译系统自动帮我们识别了。

#include <stdio.h>
#define A 110
int main()
{
	printf("%d",A+100);	

	return 0;
} 

运算结果:210 

源代码:

#include <stdio.h>
#define NUM 100.0
#define DEBUG
#define A 110
int main()
{
	int a;
	printf("%f\n",NUM+100);
#ifdef A
	printf("%d",A);	
#endif	

#ifdef DEBUG
	scanf("%d",&a);
	printf("%d\n",a);
	printf("当前行号:%d\n",__LINE__);
	printf("当前文件路径:%s\n",__FILE__);
	printf("当前编译日期:%s\n",__DATE__);
	printf("当前编译时间:%s",__TIME__);
	
#endif	

	return 0;
} 

运行结果:

3、宏函数

宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个(或较小):

#define MINNUM2(A,B)	printf("最小值为:%d\n",A>B ? B:A) 
#define PRINT(CH)		puts(CH)
#define PRINT_ARR(ARR,N)	for(int i=0;i<N;i++)\
							{					\
								printf("%d ",ARR[i]);\
							}

这个功能好像我们也能用函数来实现,那为什么不使用函数呢?有两个原因。首先,用于调用和从函数返回的代码很可能比实际执行这个小型工作的代码更大,所以使用宏要比使用函数在程序中的规模和速度都更胜一筹。

其次,更为重要的是,函数的参数必须声明为一种特定的类型,所以它只能在类型合适的表达式中使用。但是宏是与类型无关的

有优点就会有缺点,和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的副本都将会插入到程序中。除非宏非常短,否则使用宏可能会大幅度增加程序的长度。

源代码:

#include <stdio.h>
#define MINNUM2(A,B)	printf("最小值为:%d\n",A>B ? B:A) 
#define PRINT(CH)		puts(CH)
#define PRINT_ARR(ARR,N)	for(int i=0;i<N;i++)\
							{					\
								printf("%d ",ARR[i]);\
							}				
int main()
{
	int a,b; 
	printf("请输入两个整数:\n");
	scanf("%d %d",&a,&b);
	MINNUM2(a,b);
	
	char ch[10]="123456";
	PRINT(ch);
	
	int arr[5]={1,2,3,4,5};
	PRINT_ARR(arr,5);
	
	{
		FILE *fp;
		fp = fopen("__TIME__.txt","a");//打开文件方式为写入 
			fprintf(fp,"当前调试时间为:%s\n",__TIME__);//将写入的结果打印到指定的文件中进行输出 
		fclose(fp);//关闭文件
	}
	
	return 0;
}

 运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不掉头发的程序猿_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值