学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从linux内核源码的kernel.c中抠出来的代码,我们来看看:

我们直接上代码:

#include <stdio.h>
#include <stdlib.h>
/*
 * min()/max() macros that also do
 * strict type-checking.. See the
 * "unnecessary" pointer comparison.
 */
//比较两个数,如果x>y,输出y,否则输出x
#define min(x,y) ({ \
	typeof(x) _x = (x);	\
	typeof(y) _y = (y);	\
	(void) (&_x == &_y);		\
	_x < _y ? _x : _y; })
//比较两个数,如果x>y,输出x,否则输出y
#define max(x,y) ({ \
	typeof(x) _x = (x);	\
	typeof(y) _y = (y);	\
	(void) (&_x == &_y);		\
	_x > _y ? _x : _y; })
//比较三个数的大小 ,输出最小的一项
#define min3(x,y,z) ({   \
	typeof(x)  _min1 = (x) ; \
	typeof(y)  _min2 = (y) ; \
	typeof(z)  _min3 = (z) ; \
	(void) (&_min1 == &_min2) ; \
	(void) (&_min1 == &_min3) ; \
	_min1 < _min2 ? (_min1 < min3 ? _min1 : _min3) ; \
		(_min2 < _min3 ? _min2 : _min3) ;} )
//比较三个数的大小 ,输出最大的一项
#define max3(x,y,z) ({   \
	typeof(x)  _max1 = (x) ; \
	typeof(y)  _max2 = (y) ; \
	typeof(z)  _max3 = (z) ; \
	(void) (&_max1 == &_max2) ; \
	(void) (&_max1 == &_max3) ; \
	_max1 > _max2 ? (_max1 > max3 ? _max1 : _max3) ; \
		(_max2 > _max3 ? _max2 : _max3) ;} )
//输出绝对值
#define abs(x) ({				\
		int __x = (x);			\
		(__x < 0) ? -__x : __x;		\
	})
//交换两个数
#define swap(a,b)  \
	do{typeof(a) __tmp = (a); (a) = (b) ; b = (__tmp) ;}while(0)
int main(void)
{
	int ret = 0 ;
	ret = max(1,2);
	printf("%d\n",ret);
	printf("%d\n",abs(-100));
	int a = 2 ;
	int b = 3 ;
	swap(a,b);
	printf("%d %d\n",a,b);

	return 0 ;
}

运行结果如图所示:

这些算法在内核中通常用宏的规格来实现,关于C语言很多算法,其实在linux内核中几乎都有,比如链表,树,图,排序,字符串,加密等等的算法和数组结构都有实现,能够深入的去理解linux内核,对学习C语言是非常有帮助的。

linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)的更多相关文章

  1. Linux内核中常用的数据结构和算法(转)

    知乎链接:https://zhuanlan.zhihu.com/p/58087261 Linux内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树. 链表 Linux内核代码大量使用了 ...

  2. 分析linux内核中的slub内存管理算法

    1. 分析的linux内核源码版本为4.18.0 2. 与slub相关的内核配置项为CONFIG_SLUB 3. 一切都从一个结构体数组kmalloc_caches开始,它的原型如下: ] __ro_ ...

  3. Linux内核中的有关Page的算法

    static inline int get_order(unsigned long size) { int order; size = (size-1) >> (PAGE_SHIFT-1) ...

  4. Linux内核中的算法和数据结构

    算法和数据结构纷繁复杂,但是对于Linux Kernel开发人员来说重点了解Linux内核中使用到的算法和数据结构很有必要. 在一个国外问答平台stackexchange.com的Theoretica ...

  5. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  6. C语言在linux内核中do while(0)妙用之法

    为什么说do while(0) 妙?因为它的确就是妙,而且在linux内核中实现是相当的妙,我们来看看内核中的相关代码: #define db_error(fmt, ...) \ do { \ fpr ...

  7. Linux内核中双向链表的经典实现

    概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核 ...

  8. Linux内核中的fastcall和asmlinkage宏

    代码中看见:#define _fastcall 所以了解下fastcall -------------------------------------------------------------- ...

  9. linux内核中的get_user和put_user

    linux内核中的get_user和put_user 在 内核空间和用户空间交换数据时,get_user和put_user是两个两用的函数.相对于copy_to_user和 copy_from_use ...

随机推荐

  1. norflash芯片内执行(XIP)

    为什么程序不能直接在nandflash上执行?出于这个疑惑带来了这篇博文,是我在网上找了很多资料后总结的,假如有误,希望马上指出来,免得我误人子弟.谢谢! nandflash和norflash NOR ...

  2. EJB3基本概念、运行环境、下载安装与运行jboss

    EJB3基本概念 什么是EJB: EJB(EnterpriceJavaBeans)是一个用于分布式业务应用的标准服务端组件模型.采用EJB架构编写的应用是可伸的.事务性的.多用户安全的.采用EJB编写 ...

  3. androidApp的完全退出

    思路:搜集整个工程所有的activity,通过循环把工程中所有的activity都关闭. 搜集工程中的activity,可以由单例模式实现, [java] view plaincopy import  ...

  4. 安卓2.x的版本使用4.x的主题

    现在,还有大部分安卓开发者在开发安卓APP时使用的是2.x的SDK版本,为了兼容2.x的手机这本倒无可厚非,但最令人头痛的就是2.x版本的主题是在太丑了,这是安卓刚推出时只考虑到了实用,并没考虑到美观 ...

  5. Android简易实战教程--第二十二话《自定义组合控件模拟qq登录下拉框和其中的一些”小技巧”》

    转载此文章请注明出处:点击打开链接   http://blog.csdn.net/qq_32059827/article/details/52313516 首先,很荣幸此专栏能被CSDN推荐到主页.荣 ...

  6. java虚拟机 jvm 方法区实战

    和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢.字段.方法.常量池.方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多 ...

  7. 06 Activity隐式跳转

    一,隐式跳转 某个Activity 需要在清单文件配置某个Activity如下信息: 注意:category要和action一起用 action:制定一个活动 在隐式跳转的可以用到 category ...

  8. 05 Activity 现场保护

    我们接电话然后返回的 Activity将会被毁了重新创建 所以我们需要在摧毁记录一些信息还原Activity 摧毁时: //在Activi被摧毁的调用此方法 @Override protected v ...

  9. Maven2插件开发入门

    一.创建Maven项目 首先创建一个Maven插件项目,可以手动或使用mvn archetype:create从原型创建.pom.xml配置如下: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  10. request.setAttribute()怎么用的?

    request.setAttribute()怎么用的? JSP1代码 String [] test=new String[2]; test[0]="1"; test[1]=&quo ...