关闭 More 保存 重做 撤销 预览

   
关闭   当前为简洁模式,您可以更新模块,修改模块属性和数据,要使用完整的拖拽功能,请点击进入高级模式
OD体育 OD体育 黑豹-最强API供应商

上一主題 下一主題
»
Leeeeo
LV5 水面的小草
帖子    154
新博币    17 提现
提现    0
     
    2856 0 | 显示全部楼层 |倒序浏览
    学习了这么多年C语言,说实话对宏自以为了如指掌了,没想到看内核代码的时候还是那么吃力,设备驱动代码中有很多这样或者那样的宏定义,各种define,博主在学习的过程中将C语言中所出现的#define定义整理总结了一下,供大家借鉴和学习。
    原来以为什么是宏?无非就是定义一个替换的量,好比#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) #<a href='http://www.jobbole.com/members/chenj0726'>@x</a>
    #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

    如有不足,请指正,谢谢!




    个人签名

    喜欢你大爷

    点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 淡定 生气 回帖 路过 感动 感恩
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表