C C++最全C语言:预处理_#define min(2),斩获offer

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

#include<stdio.h>
int main()
{
	printf("file:%s\nline:%d\n",\_\_FILE\_\_,\_\_LINE\_\_);
}

如以上代码打印了源文件和当前行号:
在这里插入图片描述

二.#define

1.#define定义标识符

使用方法:#define  标识符常量
#define定义的标识符,在预处理时会完成替换。
替换后,代码中不再含有标识符。
在这里插入图片描述
  上图中的标识符MAX,STRING经过预处理后被替换成100,“abcdef”。

2.#define定义宏

#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)

下面是宏的申明方式:
#define  name( parament-list ) stuff
其中的parament-list是一个由逗号隔开的符号表,他们可能出现在stuff中。
在这里插入图片描述

我们仍然举例说明:

#define SUB(x,y) x-y
int main()
{
	int a = 10;
	int b = 20;
	int c = SUB(a, b);
	printf("%d", c);
}

上述代码中,在进行替换时,a,b作为参数也替换了x和y。
这就叫做宏。

Tips:参数列表的左括号必须和name相邻,如果之间有空白,参数列表就会变成stuff的一部分。
即下图的情况:
在这里插入图片描述

3.#define替换规则

宏替换发生在程序运行的预处理阶段,不进行实质性的程序运算,只做简单的文本替换
如何理解这个文本替换呢?
请看以下代码:

#define SQUARE(x) x\*x
int main()
{
	int a = 10;
	int b = SQUARE(a);
	int c = SQUARE(a+1);
	printf("%d\n", b);
	printf("%d\n", c);
}

输出结果为100 和 21.
如下图:
由于是文本替换,不会自动给我们加上括号,
基于操作符的优先级,没有达到我们想要的效果。
在这里插入图片描述
因此在写宏的时候,不要吝啬括号,这样可以防止出错。

#define SQUARE(x) ((x)\*(x))
//完善后,单独的元素带括号,总体的结果也带了括号

4. # 和 ##

#的使用:

我们看以下代码,发现两个printf有很大的相似性。
可不可以其他们封装成一个函数Print呢?

#include<stdio.h>
int main()
{
	int a = 10;
	printf("the value of a is %d\n",a);
	int b = 10;
	printf("the value of b is %d\n",b)
}

似乎是不行的,我们没法改变字符串里面的N为a或者b。

void Print(int n)
{
	printf("the value of N is %d\n", n);
}

难道就这样没有办法了吗?
我们先看以下代码的输出:

int main()
{
	printf("Nice shoot!!!\n");
	printf("Nice ""shoot!!!\n");
}

执行后我们发现输出是一样的。
这说明C语言里的字符串会自动连接。
如下图:
在这里插入图片描述
这就有说法了,
如果我们利用这个特点,在两个字符串中间插入a,b的通式,不就能够完成了吗?
(图片)

我们定义一个宏,
利用#操作符将参数直接转换成字符串,
即把参数N变为“N”,
字符串连接后就形成了我们想要的效果。

#define Print(N) printf("the value of "#N" is %d\n",N);
int main()
{
	int a = 10;
	Print(a);

	int b = 20;
	Print(b);
}

输出为
在这里插入图片描述
我们可以再深一步,如果a和b的数据类型不同,应该怎么写,来继续达到我们的目的?

#define Print(N,format) printf("the value of "#N" is "format"\n",N)
int main()
{
	int a = 10;
	Print(a,"%d");

	double b = 20.0;
	Print(b,"%lf");
}

没错,我们可以把打印格式作为参数传入写成通式。

##的使用
用于将其两边的符号合成为一个:
如以下代码:

#define CAT(Tf,boys) Tf##boys
int main()
{
	int CAT(Tf, boys) = 5;
	printf("%d", Tfboys);
}

在这里插入图片描述

5.带副作用的宏参数

我们看以下代码:

int main()
{
	int a = 2;
	int b = a + 1;
	int b = ++a;
}

a+1和++a都给b赋值3,结果是同样的。
但++a的同时对a造成了改变,我们将其视为副作用。
这个副作用可能在我们意识不到的时候出错。
在宏定义中我们应该尽量避免。

#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
	int a = 5;
	int b = 8;
	int c = MAX(a++, b++);
	printf("%d\n", c);
	printf("%d\n", a);


![img](https://img-blog.csdnimg.cn/img_convert/711a83fba7074e254c0edabdbb8d9522.png)
![img](https://i-blog.csdnimg.cn/blog_migrate/a247debc478f3b8c676320956a364176.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

xnZtpx-1715692684877)]
[外链图片转存中...(img-SMuL54nU-1715692684877)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值