c语言 编译开关用法,C语言中define的使用方法
C语言中define的使用方法
学习了这么多年C语言,说实话对宏自以为了如指掌了,没想到看内核代码的时候还是那么吃力,设备驱动代码中有很多这样或者那样的宏定义,各种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
c语言 编译开关用法,C语言中define的使用方法相关推荐
- c语言 函数参数 const,c语言中const的使用方法
c语言中const的使用方法 发布时间:2020-06-22 16:03:32 来源:亿速云 阅读:188 作者:Leah 这篇文章运用简单易懂的例子给大家介绍c语言中const的使用方法,代码非常详 ...
- c语言typedef的用法,C语言中typedef用法总结,看完就能像编程老手一样熟练运用...
请看下文 C语言中typedef关键字应用比较常见,许多C语言初学者对它的用法不甚了解.事实上,我们可以用typedef来定义自己习惯使用的数据类型名称,可以替代自己所熟悉的基本类型.数组类型.指针类 ...
- 6s在c语言中的用法,C语言中assert的用法讲解
assert是指编写代码时做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.下面是小编为大家整理的C语言assert的用法讲解,欢迎参考~ assert宏的原型定 ...
- c语言中a 的用法,C语言中#define的用法
define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#"号开头,如包含命令#include,宏定义命令#define等.一般都 ...
- c语言goto语句用法_C语言中的goto语句该不该使用?
关于C语言的goto语句存在很多争议,很多书籍都建议"谨慎使用,或者根本不用".这里先不做过多的讨论,存在即合理,既然是C语言中的一个知识点,我们还是有必要学会使用.先看一些got ...
- c语言函数time用法,c语言中time函数详解
总结: time_t time(time_t *timer); 返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到此刻的本地时间所经过的秒数,time_t实际是个long长整型 ...
- sort在c语言中的作用,c语言中sort的用法详解.docx
c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...
- c语言define需要分号骂,C语言中define的用法
C语言中define的用法 2016-01-06 15:00 来源: 博客园 define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#& ...
- c语言数组中define,c语言中#define的用法
c语言中#define的用法 C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译 ...
最新文章
- 基于Python实现图画转换字符画
- 大小端字节序介绍以及判断当前环境字节序的程序【C语言】
- 8月6日云栖精选夜读 | 阿里云CPFS在人工智能/深度学习领域的实践
- 10个 Python 程序员,9个不合格?
- 同事都说有SQL注入风险,我非说没有
- HDU - 6267 (概论/找规律/递推)
- Zabbix监控nginx status
- 拟合公式_Graphpad Prism 8.0对散点图进行拟合
- POJ - 2392 朴素多重背包 + 贪心 WA与AC代码细节分析
- a*算法的优缺点_垃圾回收的常见算法
- 经典排序算法(十三)--奇偶排序Odd-even Sort
- C# 控制台如何播放音频文件
- c++实现单例模式完整源代码
- OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发
- 总结:VC小知识!(网上找的)
- 重拾Java基础知识:枚举
- 初识Cpp之 六、内存分配
- c语言中girth的作用,C++初级问题,急救中!!!
- Ls-Dyna 软件简介 (1)
- 配置iis解析php
热门文章
- SpringBoot - OAuth2第三方登录之QQ登录
- lua服务器客户端消息回调,lua服务器客户端消息回调
- 第二章 聚合数据模型
- linux查看raw格式磁盘,KVM之raw和qcow2格式虚拟磁盘创建
- Python 医学知识图谱问答系统(一),建立医学知识图谱,基于neo4j知识图谱的医学问答体系
- 小学生python编程教程-小学生python编程在线教育-小码精灵编程线上教育机构
- 关于solidity解析abi方法,入参和结果字节码
- 证书类型、自签CA证书、https双向认证(一篇就懂系列)
- maven lastUpdated 文件清理脚本
- Android 9.0 Toast源码改变引发的问题