linux内核max函数实现

Linux内核函数中的max函数编写得非常优秀,让我忍不住要拿出来分析一番。传统定义max函数是#define max(X,Y) ((X) > (Y) ? (X) : (Y))。是不是觉得这样定义已经perfect了,那先看下面这个例子。

int x = 1, y = 2;

printf("max=%d/n", max(x++, y++));

printf("x = %d, y = %d/n", x, y);

 

按道理max函数执行完成后,x=2,y=3。但是实际得到的结果是x=3,y=4。预编译后程序编程这样:printf("max=%d/n", x++ > y++ ? x++ : y++); x++和y++都被执行了两次。同时当比较两种不同类型的数据时,编译器应该给出警告信息,所以很遗憾linux内核不会采用这种扛不住测试的代码存在。

Linux内核中max函数定义如下所示。

linux内核max函数实现_第1张图片

内核中定义的max函数可以避免出现刚刚出现的i++问题,稍微有点c代码基础的都能看明白这个代码。Typeof(x)代表定义一个x类型的类型;最后一行是?和:表达式。({statement list})这个是GCC的扩展,({statement list})是一个表达式,逗号表达式类似,但是功能更强,({与})中可以包含有多条语句(可以是变量定义、复杂的控制语句),该表达式的值为statement list中最后一条语句的值。

有人可能会想了,那第四条语句在此有什么意义呢?读者应该相信linux内核不会写无用的代码。该语句是用来判断传入两个参数的类型,比较类型我们可以通过比较指针,指针只有满足地址和类型这两个参数后才能访问,编译比较这两个地址时,这两个指针的值是肯定不相等的,如果类型不相等的两个指针做比较,那么编译器会发出警告信息。这里的巧妙之处是用这条语句判断传入的参数是不是同一种类型。

 

你可能感兴趣的:(work)