热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

面试中定义一个比较两个数大小的宏:简单的宏定义:#defineMAX(x,y)xy?x:y此种写法当x,y是表达式时会出问题:所以

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

简单的宏定义:

#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; })

补充:\ 表示强制换行,而换行后的内容与前一行的内容编译器仍把它看作是同一行.
#define后面定义的内容比须在同一行,而有时是为了让程序便于阅读,从中间进行换行,如果没有符号’’,则我们的换行表示 #define的结束,这也是为什么你去掉后会报错的原因.如果在这里加了’’,也可以说是对"回车"的转义,表示这里有一个回车字符而已,#define并没有结束.而程序编译的时候,编译器会忽略掉这些’\回车’的字符.
如果你会用LINUX系统的话,你用命令行中输入 ls \回车 ,系统也不会执行ls这个命令.它会认为你命令仍没有输完,会继续等待用户的输入.

 

用#define来实现找Max(x,y)和swap(x,y). 定义函数注意一定要加换行符\;

#include#define Max(x,y)({ \typeof(x) _x = (x); \typeof(y) _y = (y);\(void)(&_x == &_y);\_x > _y?_x:_y;\
})#define Swap(x,y)({\typeof(x) _x = (x);\typeof(y) _y = (y); \typeof(x) z;\(void)(&_x == &_y);\z = x^y;\x = x^z;\y = y^z;\
})int main()
{printf("max(2,8)=%d\n",Max(2,8));int a = 1;int b = 2;char c = 'a';char d = 'b';Swap(a,b);Swap(c,d);printf("a=%d,b=%d\n",a,b);printf("c=%c,d=%c\n",c,d);return 0;
}

 


推荐阅读
author-avatar
赵以书的话_256
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有