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的使用方法相关推荐

  1. c语言 函数参数 const,c语言中const的使用方法

    c语言中const的使用方法 发布时间:2020-06-22 16:03:32 来源:亿速云 阅读:188 作者:Leah 这篇文章运用简单易懂的例子给大家介绍c语言中const的使用方法,代码非常详 ...

  2. c语言typedef的用法,C语言中typedef用法总结,看完就能像编程老手一样熟练运用...

    请看下文 C语言中typedef关键字应用比较常见,许多C语言初学者对它的用法不甚了解.事实上,我们可以用typedef来定义自己习惯使用的数据类型名称,可以替代自己所熟悉的基本类型.数组类型.指针类 ...

  3. 6s在c语言中的用法,C语言中assert的用法讲解

    assert是指编写代码时做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.下面是小编为大家整理的C语言assert的用法讲解,欢迎参考~ assert宏的原型定 ...

  4. c语言中a 的用法,C语言中#define的用法

    define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#"号开头,如包含命令#include,宏定义命令#define等.一般都 ...

  5. c语言goto语句用法_C语言中的goto语句该不该使用?

    关于C语言的goto语句存在很多争议,很多书籍都建议"谨慎使用,或者根本不用".这里先不做过多的讨论,存在即合理,既然是C语言中的一个知识点,我们还是有必要学会使用.先看一些got ...

  6. c语言函数time用法,c语言中time函数详解

    总结: time_t time(time_t *timer); 返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到此刻的本地时间所经过的秒数,time_t实际是个long长整型 ...

  7. sort在c语言中的作用,c语言中sort的用法详解.docx

    c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...

  8. c语言define需要分号骂,C语言中define的用法

    C语言中define的用法 2016-01-06 15:00  来源: 博客园 define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#& ...

  9. c语言数组中define,c语言中#define的用法

    c语言中#define的用法 C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译 ...

最新文章

  1. MyBatis的动态SQL详解
  2. CentOS7编译安装nginx-1.8.1和编译参数
  3. KEIL-MDK 5 CMSIS的问题
  4. 语言深入:java中究竟是传值还是传引用
  5. 2015-03-18 - Deliberately pass a wrong note type for my task creation
  6. centos8安装MySQL依赖_centos8安装mysql8
  7. linux多线程九宫格,项目实战:Qt九宫格图片资源浏览器(支持window、linux、兼容各国产系统,支持子文件夹,多选,全选,图片预览,行数与列数设置等)...
  8. 浅谈css3长度单位rem,以及移动端布局技巧
  9. php post提交 java接收,asp如何接收php或java提交post过来的json数据
  10. 网络基础知识(黑马教程笔记)-7-异步编程和Promise
  11. C语言生成随机数的方法
  12. 新买的笔记本计算机内存不足,笔记本内存不够怎么办_笔记本内存不足如何解决...
  13. C++开发 一个壁纸小软件
  14. python总结大纲:适合初学者与有经验的人快速查找遗忘的知识点
  15. 二、CString、CStringA 和 CStringW
  16. 41. Vue组件传值-父组件向子组件传值
  17. 【Web技术】网站留言系统开发,及留言信息实时发送至指定邮箱
  18. 3.4 Docker最新入门教程-Docker入门-共享应用程序
  19. Python爬取斗鱼直播网站信息
  20. 关于本地时间和网络时间校验

热门文章

  1. excel 使用技巧小总结
  2. s3c6410的GPIO操作
  3. php怎么检测数据类型,PHP检测数据类型的几种方法总结和技巧
  4. 抓娃娃机vue版本和jquery版本
  5. 利用Python+opencv模块的dnn实现Faster R-CNN(一)
  6. IDEA如何创建XML文件并用浏览器打开
  7. 死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
  8. Java 8 新特性 lambda表达式
  9. 一篇走心的iOS代码规范!
  10. 配置 OpenStack 命令 自动 补全