欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux 内核阅读宏定义#define的使用总结

程序员文章站 2024-03-22 10:11:16
...

面试中定义一个比较两个数大小的宏:

简单的宏定义:

#define  MAX(x,y)  x > y ? x : y

此种写法当x,y是表达式时会出问题:所以基本改进如下:

#define MAX(x,y) (x) > (y) ? (x) : (y)

#define MAX(x,y) ((x) > (y) ? (x) : (y)) //此种方法最好

上面几种写法是我们在面试中常写的几种宏定义。

接下来我们学习一下更加高级的宏定义吧,接下来我们看一下内核里面的宏定义来学习吧!

#define MAX(x,y)({     \
    int _x = x;        \
    int _y = y;        \
    _x > _y ? _x : _y; \
})

在上面这个宏中,我们定义的两个临时变量数据类型是int型,只能比较两个整型的数据。那对于其它类型的数据,就需要重新再定义一个宏了,这样太麻烦了!我们可以基于上面的宏继续修改,让它可以支持任意类型的数据比较大小:

#define MAX(type,x,y)({     \
    type _x = x;        \
    type _y = y;        \
    _x > _y ? _x : _y; \
})

当我们不想定义type类型的时候,那么我们又将如何进行比较呢!当传入的参数类型不一致时,我们又将如何处理呢!

我们可以看下学习下下面这个宏定义:

#define max(x, y) ({    \
    typeof(x) _x = (x); \
    typeof(y) _y = (y); \
    (void) (&_x == &_y);\
    _x > _y ? _x : _y; })