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. 线程的生命周期其实没有我们想象的那么简单!!
  2. 构建可靠的前端异常监控服务-采集篇
  3. Oracle优化06-Hint
  4. Machine Learning - Andrew Ng on Coursera (Week 2)
  5. Go 指针 unsafe.Pointer
  6. apache php 3秒,php版本(5.3,5.5,7.0)及运行模式(fast-cgi/fpm,apache模块)之间性能对比测试...
  7. 用鼠标在窗口中画方形的程序------基于OpenCV+VS
  8. LibreOffice的使用技巧
  9. CalendarDemo Calendar 类的创建及用法
  10. Mybatis对象中含有list对象
  11. 机器学习算法-十大常用算法
  12. GStreamer系列-基础概念
  13. PC端答题小助手软件 – 用 OCR 高效完成在线答题
  14. 为什么PMOS比NMOS的沟道导通电阻大,速度慢,价格高-透彻详解
  15. 暗月渗透实战靶场-项目七(下)
  16. apache OpenNLP简要介绍
  17. python中format使用
  18. HDU 1873 - 看病要排队 ← 优先队列
  19. HTML表格自动排序
  20. ChinaSkills-网络系统管理(2021年全国职业院校技能大赛B-1 模块 B:Windows 环境 评分标准 )

热门文章

  1. seewo一键投屏在mac电脑上的使用方法
  2. “内存不能为read/written”是什么原理?
  3. 二建《机电》案例 100 问
  4. 09年软件评测师考试下午试题答案
  5. 《数据结构与算法分析》课程设计——贪吃蛇问题
  6. Linux下批量ping ip地址
  7. root cause java.lang.LinkageError: loader constraint violation: loader (instanc
  8. 计算机图形学孔令德基础知识,欢迎访问 孔令德计算机图形学精品资源共享课课程网站...
  9. 分享143个ASP源码,总有一款适合您
  10. 7月7日云栖精选夜读:专访 | 杨强教授谈CCAI、深度学习泡沫与人工智能入门