C语言中预处理详解(预定义符号的使用 #define 宏和函数的区别 # ## 运算符的使用方法 )

本文详细介绍了C语言中预定义符号的使用,#define的不同操作(包括常量定义和宏),以及#和##运算符在处理字符串和创建标识符中的作用。作者强调了正确使用这些技术的重要性,并鼓励读者发挥创意运用宏来简化代码。
摘要由CSDN通过智能技术生成

一、预定义符号

这五个符号都可以直接在C语言的程序中使用,看例子大家可能会很好理解,如下:

二、#define 的不同使用操作

1、#define name stuff    (#define 定义常量的操作)

这个相信大家都不陌生,在之前的讲解中,相信大家都已经明白所以直接给出例子就行。

在程序进行预处理操作的时候,代码中的MAX都会被100替换,所以才会产生上面的结果。

2、#define 用来定义简单的操作(#define 定义宏)

注意:name后面的()必须与name紧靠,不能有空格,要不然就和#define定义常量一样,()里面的就被编译器认定为常量,就会出错!

根据上面的操作方式写一段代码,大家先看一下代码:

刚入坑的朋友们肯定不知道这是怎么来的,其实原理和 #define 定义常量的相同,在程序进行预处理操作的时候,代码中的所有 MAX(X,Y)都会被替换成  ((X)>(Y)?(X):(Y)),相当于进行了比大小的操作,所以最后才会产生20的结果。有的朋友可能也会看出来那这和函数有什么区别,在博客的后面我会告诉大家。

注意:如果是下面的代码就会出现问题,所以建议大家在使用#define的时候一定要在适当的位置加上括号

按理说 ret 应该是40,但是为什么是30,是因为2 * DOUBLE(a)直接被转化为 2 * 10 +10,不会被计算,所以最后结果是30,所以在我们使用#define的时候记得在适当的位置要加上括号。这是刚入坑的朋友最容易犯的错误,大家要注意一下,如下改一下即可:

其实在了解了#define 用来定义简单的操作(#define 定义宏)之后,大家大可不必局限于上面的求两个数最大值的操作,发挥想象力,它会有很多的用途,例如程序员想简化、清晰自己的代码,就可以用这个操作,如下:

这样是不是更加让自己开辟内存的代码简单明了,所以请大家发挥想象力,来使用它定义简单的操作。

三、#define定义简单操作和函数的区别

通过对比相信大家也很容易理解,在这块我就不做解释了。

四、# 和 ## 运算符的理解

1、 #  运算符

先看下面一段代码:

这样写起来是不是很麻烦,遇到一个内容就要写一个printf,写的小编有点不耐烦了,转念一想,刚学了#define定义简单操作,不如用这个来试试,于是我开心的写出了下面的代码;

小编一看,怎么会这样,和上面的结果为什么不一样,翻来覆去,最后发现了这个 # 操作符,当我们在   #define PRINT(X) printf("X = %d\n",X)   这段代码中需要将双引号里面的 X 变为 a 和 b 不能直接用X因为双引号里面的X不会变是啥就打印啥,那要怎么办呢,这时候就用到了 # 操作符。

给大家解释一下它的操作方法

如上面的例子,直接在 X 前面加上 # 即可,即表示 #X == " a " 或者 == " b "不知道大家知不知道printf 的不同的使用方法,如下:

因为 #X == " a " 或者 == " b ",所以最终它就可以被改为

这样就可以解决问题,这也就是 # 操作符的操作方式。

2、## 运算符

先看下面一段代码:

为了比较这些数据的大小,小编写了两个函数来比较(有点不耐烦),为了发现更加简单明了的方法,小编又想起来了#define定义简单操作的方法,于是打算用#define写一个这种比较函数的框架如下:(未修改)

为了看的清楚也可以写为:(未修改)

每一行后面的   \  是用来把它们连接起来的,注意  \  后面只能是回车换行,不能是别的其他东西。

它现在代表的就是一个函数的框架,在使用函数前,我们必须有函数的声明才可以,所以就有这个​​​​​​​

因为我们用  int  类型和 float 类型的,所以声明这两个函数,后面使用时就可以正常使用了。小编费了很大的劲终于写完了,请看(未修改)

但是不能运行。因为红色框里的东西,type_ max 它在转化后不能表示 int_max或者float_max,可以简单理解为 type_max 不是 单一的 type,所以他在预处理的时候不能被替换,所以不能运行是因为程序没有找到 type_max 的函数,那要怎么修改才可以,小编翻来覆去,最后发现 ## 运算符。

## 可以把位于它两边的符号合成⼀个符号,它允许宏定义从分离的文本片段创建标识符。 ## 被称 为记号粘合

看下例子可能会明白。(修改后)

这样就相当于     type##_max == int_max 或者 == float_max,在进行预处理时它会把 ## 去掉,并且把 type 替换,这样上面的程序就可以正常运行了。修改后完整如下:

五、结语

今天的内容很多,相信大家看完后可能会有不明白的地方,没事请随便来打扰我,我看到大家的问题会仔细回答的,因为我一开始也不是很懂,也是请教别人才深入理解的。吾爱吾师,吾更爱真理,刚开始学习大家的求知欲肯定很高,我会的一定会帮大家回答。一起加油!!!

  • 31
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值