C语言define关键字全解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: C语言define关键字全解析

🧑🏻作者简介:一个走在前行路上的人

✨联系方式:2201891280(QQ)

⏳全文大约阅读时间: 60min


☘前言☘

偷个图,如果用上面的方式写代码,中文编码指日可待有没有?哈哈哈哈

在工程代码中,头文件的最开始就能看到一大片#define,今天我们就看一下define这个关键词究竟是怎么用的。这些知识主要来源于博主最近的实习经历和自己写代码的习惯提炼出来哦。


🧂1.防止重复包含

不知道小伙伴们有没有发现我们就算再我们的c文件里面写了两次#include <stdio.h>也没有提示我们重复包含,但是自己写一个头文件的时候就会提示这个问题。

其实我们看看标准库文件都可以看到一些有趣的应用


#ifnodef __TEST__
#define __TEST__
...
代码段  头文件 blabla
...
#endif


这个的作用就是判断是否定义了一个宏,未定义就进行定义并进行相关变量结构体之类的定义,定义的话就会跳过这部分,可以防止重复定义。

同时这个思维也可以用于debug和正式版的切换,这个等下再说。

🎐2.定义常量

其实这个是我们平常最常见的定义方式了,大家应该都会用吧???是吧是吧?但是呢,有坑。。。。


#define PI 3 + 1
printf("%d",10*PI);


我们得到的结果就是31,因为define就是简单的替换,那么后果就是替换成了10*3+1,所以写宏定义的时候建议统统加上括号,防止出错。

所以上面的就是


#define PI (3+1);
printf("%d",10*PI);


就正常啦。


🕷️3.定义函数

宏定义可以作为一些函数来使用,我举几个例子


#define MAX(a,b) ((a)>(b) ? (a) : (b))


这个就是一个求最大值的函数,可以看到全加了括号,就是为了防止上面定义常量出现的问题。


#define SWAP(a,b) do{\
  int t = a;\
  a = b;
  b = t;
}while(0);


就可以实现a、b的交换,可以学到一个小知识就是define可以换行只要加上\,同样的思路也可以用在printf中哟。


const double eps = 1e-8;
const double pi = acos(-1.0);
#define Equ(a, b) ((fabs((a) - (b))) < (eps))
#define More(a, b) (((a) - (b)) > (eps))
#define Less(a, b) (((a) - (b)) < (eps))
#define MoreEqu(a, b) (((a) - (b)) > (-eps))
#define LessEqu(a, b) (((a) - (b)) > (eps))


结合比较函数,我们可以写一些浮点数的比较啦扒拉扒拉,感兴趣可以看看我另外一篇文章。1.3 浮点数的比较


🕷️4.#、#@和##

#define TOSTRING(a) #a
#define CONNECT(a,b) a##b
#define TOCHAR(a) #@a //Microsoft Specific


其实看完上面的代码就很简单了#代表的就是将a变成一个字符串,不过需要注意的是这个返回的是一个指针,也可以说字符串数组,whaterver。

然后##有点类似于strcat会将两个连接到一起返回。

#@用于返回一个字符,有人看到我写的Microsoft Specific了么,这玩意微软专属。。。。。所以在linux下的话我看到有两种写法可以实现类似的功能。

#define TOCHAR(a) #a[0]
#define TOCHAR(a) *#a


其实看一眼都是懂得,就是取出第一个元素来变化,有个小点不知道大家有没有发现其实第一行的结合顺序是先#a然后再[0]的,这样才能取出第一个元素。而第二个就是直接解引用了。


🍔5.一些参数

上班第一天的代码给我看傻了


#define DEBUG
#ifdef DEBUG
#define APP_PRINT(...) printf(__VA_ARGS__)
#else
#define APP_PRINT(...)
#endif


这种写法就是为了控制debug版本和正式版本的,其中__VA_ARGS__就是...匹配到的内容,这样就可以直接控制是否输出调试信息,简直牛犇!!!但是注意这个只支持再后面书写如果书写a...b是错误的,...之后不能再加任何信息了,听别人说的,我试了,是真的0.0,只能接括号


🎶6.一些预定义的宏

d6ed76d050a850af16d26dd831ba8d5.png

🍢写在最后

今天就写到这里了,如果大家觉得对你有帮助的话还希望大家动动手指给个三连0.0

你的支持是我前进最大的动力。


相关文章
|
1月前
|
编译器 C语言
C语言:typedef 和 define 有什么区别
在C语言中,`typedef`和`#define`都是用来创建标识符以简化复杂数据类型或常量的使用,但它们之间存在本质的区别。`typedef`用于定义新的数据类型别名,它保留了数据类型的特性但不分配内存。而`#define`是预处理器指令,用于定义宏替换,既可用于定义常量,也可用于简单的文本替换,但在编译前进行,过度使用可能导致代码可读性下降。正确选择使用`typedef`或`#define`可以提高代码质量和可维护性。
|
1月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
1月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
3月前
|
程序员 C语言
位操作在C语言中的解析与应用
位操作在C语言中的解析与应用
90 0
|
5月前
|
存储 Java 数据库
Static关键字在Java中的多种用途解析
Static关键字在Java中的多种用途解析
|
5月前
|
JavaScript 前端开发 开发者
JavaScript中的const关键字解析
JavaScript中的const关键字解析
|
4月前
|
C语言
|
4月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
4月前
|
存储 Java 数据库
Static关键字在Java中的多种用途解析
Static关键字在Java中的多种用途解析
|
5月前
|
C语言
C语言实现猜数字游戏:代码详解与函数解析
C语言实现猜数字游戏:代码详解与函数解析
218 0

推荐镜像

更多