🧑🏻作者简介:一个走在前行路上的人
✨联系方式: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.一些预定义的宏
🍢写在最后
今天就写到这里了,如果大家觉得对你有帮助的话还希望大家动动手指给个三连0.0
你的支持是我前进最大的动力。