define在C语言中用法
原来以为什么是宏?无非就是定义一个替换的量,好比#define PI 3.1415926,这样的功能,再深一点就是写一个类似函数的定义,好比#define MAX(a,b) ((a) > (b) ? (a) : (b))这样的功能,再问一下宏是什么?无非就是预处理阶段所要展开的乱七八糟的东西,其实也就知道这么点,当看了Linux Kernel Code,其实会发现自己懂得那些其实都是皮毛,不值一提的小东西,才发现自己OUT了,为此博主将#define的使用方法总结了一下,如下所示:(如有不足请批评指正)
1. 最最最简单的define定义
不赘述了,说一下其他的吧,如#define MAX 10,编译器在处理这个代码之前会对MAX进行处理,替换为10,或许有些人认为这样的定义看起来和const常量很相似,但是他们还是有区别的,#define的定义其实就是简单的文本的替换,并不是作为一个量来使用
2. 用#define来对函数进行“定义”
很多就会问了,什么?居然还能用#define来定义函数,坑爹么?其实咋说呢,就是类似的一个函数定义罢了,和真正的函数定义当然还是有区别的了,下面进行举例说明:
还是用上面的MAX的例子:#define MAX(a,b) ((a) > (b) ? (a) : (b)),这个定义就返回两个数中较大的那个,不知道你们看到了没看到,这个”函数“没有类型检查,像不像函数模板?像?不像?
其实是有点像的,可以作为一个普通的模板来使用罢了,他肯定没函数模板那么安全,WHY?看下面的例子:
#define MINUS(a,b) a - b,眨眼一看,这个肯定是减法操作的define,有木有?对,没错,就是这个意思,这个定义在一般的使用中没问题,但是在特定的情况下使用会出现问题,如果我们要这样去使用 的话,展开之后会是什么样子呢?如:2 * MINUS(a,b) / 4,就像我前面所说的那样,宏其实就是一个简单的文本替换,所以展开时候就变为 2 * a - b / 4,和我们想要的结果是不是不一样?是不是错 了?有木有?那要如何解决这个问题呢,很简单,给原定义加一个括号就OK了,也就是#define MINUS(a,b) (a - b)
再说一个经常出现的一个错误,看下面的例子:
#define pin (int *)
pin a,b;
本意其实都想让a和b成为int型指针,但是实际上却变成了int *a,b;a是int型指针,b是int型变量,咋处理捏?这个时候typedef就出来了,它说我可以满 足define满足不了的要求,所以改成
typedef pin (int *) 就OK了。
TIP:我们在写code的时候一定要养成一个良好的习惯和一个良好的代码编写风格,建议所有的层次都加上括号
3. define的单行定义,举例说明之,属于少见用法
#define A(x) ##x
#define B(x) #@x
#define C(x) #x
如果我们假设x=1,那么A(1)就是1,B(1)就是‘1’,C(1)就是”1“
4. define的多行定义
#define可以进行多行定义,虽然看起来有点蛋疼,但是确实是一个灰常经典而且在设备驱动代码中经常要用到的一个方法,格式如下:
#define MACRO(arg1,arg2) do { \
test1; \
test2; \
}while(0)
TIP:在每一行的末尾要加上\,切记!
5. 定义宏和取消宏定义的方法
定义一个宏使用#define,取消一个宏定义使用#undef
6. 使用宏进行条件编译
格式如下:#ifdef ... (#else) ... #endif
如:
#ifdef HELLO
#define WORLD 1
#else
#define WORLD 0
#endif
7. 用define来处理头文件被头文件或者源文件包含的情况
由于头文件包含可以嵌套,那么c文件有可能包含多次同一个头文件,就会出现重复定义的问题的,那么可以就通过条件编译开关来避免重复包含,如下:
#ifndef _HELLO_H_
#define _HELLO_H_
...
//文件内容
...
#endif
define在C语言中用法相关推荐
- define在c语言中的作用域,define是什么意思,【C语言】“define”是什么意思
导航:网站首页 > define是什么意思,[C语言]"define"是什么意思 define是什么意思-,[C语言]"define"是什么意思?代表什么 ...
- define 在C语言中的作用,c语言中的define用法
作为代码中,第一个看到的,极有可能就是define这个东西,称为宏!(define是可以出现在任何地方的,但是我们一般把这个写到最开始)然而,很多时候,初学者有时候可能看不懂她,因此,我的c语言学习的 ...
- carry函数在C语言中用法,CArry的使用完整版.doc
CArry的使用完整版 CArray的用法 templateclass CArray:public CObject 参数 TYPE 模板参数指定存储在数组中的对象的类型.TYPE是一个由CArray返 ...
- clear在c语言中用法,clear的用法总结大全
clear的意思 adj. 清楚的,明白的,清晰的,明亮的,清澈的,明确的 adv. 完全地,清晰地,整整 vi. 变明朗,变清澈 vt. 扫除,除去,消除(嫌疑),使清楚,使干净 n. 空隙,空间 ...
- clear在c语言中用法,C++ map::clear()用法及代码示例
Map是字典一样的数据结构.它是(键,值)对的关联数组,其中每个唯一键仅与单个值相关联. map::clear() clear()函数用于从Map容器中删除所有元素,从而使其大小保持为0. 用法: m ...
- carry函数在C语言中用法,carry的用法
carry用作动词表示携带,运送,搬运 ,carry多用作及物动词,主语多为人,也可为天然或人工的通道等,宾语则为运送的有形物或无形物. 1.carry的基本意思是"运输"&quo ...
- 单片机C语言知识用法之,单片机C语言知识用法之define
define的定义: define是C语言中的一个预处理指令,其中的"#"表示这是一条预处理命令·.凡是以"#"开头的均为预处理命令,"define& ...
- C语言中一些基本问题
一.小白在学习过程中有时会在程序中看到0u或是0ul等常量有后缀的情况,如果没接触到C语言常量后缀的话可能就有点疑惑~ 其中的u为unsigned,l为long,f为float C语言中常量的默情况: ...
- c语言中 d的用法,C语言中的#define用法总结
1.宏定义 格式: #define 标识符(也称为宏名) 替换列表 例如; #define PI 3.14 以上代码就是定义了一个宏. 宏的名称为PI, 我们在使用的时候,会在编译预处理时, ...
最新文章
- ffmpeg + opencv 实现视频播放器(没有声音)
- 计算机网络面试知识总结1
- Linux中防火墙(二)
- java condition_死磕Java并发:J.U.C之Condition
- python正则表达匹配汉字
- 重新审视自己和自己的目标
- windows 中搭建Zookeeper的搭建
- 【题解】跳房子-C++
- linux给命令起别名命令,alias命令 – 设置命令别名
- 图片转可编辑ppt_电脑如何简单快速将图片转为文字,不用下载任何软件,免费使用。...
- 算法优化——位运算的优化技巧
- 2021软考资料汇总:历年真题/学习手册/学习计划/考试大纲等资料
- CAD中如何使用Lisp程序编写坐标标注功能
- cuteftp 9 显示中文乱码
- 手工画图和计算机画图的内在联系,工程制图与计算机绘图教案10-11-1
- VL1_四选一多路器(完整RTL、Testbench和覆盖率)
- 卡西欧科学计算机使用方法,卡西欧科学计算器使用教程
- awk 分隔符 多个空格_awk多分隔符
- c++ day12 虚继承和多态概念的抛出
- S3C2410中文芯片手册-11.串口
热门文章
- 利用计算机解决问题的原理方法是什么,2021安徽省中小学教师招聘中学信息技术笔试大纲...
- Springmvc框架下 jsp显示页面出现源码
- 写一个简单的打谱程序(1)
- Java前端知识积累——微信Wxml知识积累
- 【阳光服务快聊】智慧校园视频监控管理方案!
- 【好物分享】设计师|PPTer高清免扣资源
- Python解放双手系列,用python自动追踪你的快递
- 「镁客·请讲」Lucia 焦玉龙:用区块链技术切入长租行业,Lucia要做长租领域的变革者...
- 《无畏契约》游戏分析
- linux磁盘配额详细步骤,Ubuntu磁盘配额步骤