C语言define关键字全解析

简介: 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月前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
170 0
|
1月前
|
C语言
【进阶C语言】数组笔试题解析
【进阶C语言】数组笔试题解析
17 0
|
20天前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
2天前
|
C语言
循坏语句解析(C语言零基础教程)
循坏语句解析(C语言零基础教程)
|
20天前
|
存储 搜索推荐 编译器
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
|
20天前
|
存储 网络协议 编译器
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇
|
1月前
|
存储 安全 编译器
【C/C++ 基本数据类型】C++ 基本数据类型深度解析与C语言对比
【C/C++ 基本数据类型】C++ 基本数据类型深度解析与C语言对比
59 0
|
1月前
|
算法 编译器 C++
【C++ 泛型编程 进阶篇】:C++ 元模版编程 typename关键字的多种用法全解析
【C++ 泛型编程 进阶篇】:C++ 元模版编程 typename关键字的多种用法全解析
36 0
|
1月前
|
程序员 C语言
在C语言中,typedef是一种用来创建新的数据类型名的关键字
在C语言中,typedef是一种用来创建新的数据类型名的关键字
9 0
|
1月前
|
存储 编译器 C语言
C语言的关键字
C语言的关键字
14 0

推荐镜像

更多