C语言--min的宏定义

近日无心间发现,关于常见的min的宏定义,在Linux中是这样的:php

  1. /* 
  2. * min()/max()/clamp() macros that also do 
  3. * strict type-checking.. See the 
  4. * "unnecessary" pointer comparison. 
  5. */  
  6. #define min(x, y) ({     \  
  7. typeof(x) _x = (x);    \  
  8. typeof(y) _y = (y);    \  
  9. (void) (&_x == &_y);   \  
  10. _x < _y ? _x : _y; })  

关于其中的:html

  1. (void) (&_x == &_y);  

非常疑惑,表面看起来,这句话,好像不起做用,算是一句废话,因此去找了一下别人的解释,才大概搞懂是啥意思。linux

首先,咱们此处想要实现的目 的是,在计算两个数的最小值以前,但愿去判断一下两个值的类型是否一致,而因为C语言自己不支持咱们去作相似于这样的操做 typeof(_x)==typeof(_y),因此在此,经过故意判断他们2个的地址指针是否相等,而显然&_x,即x的地址,是不可能等于& amp;_y的,可是这句话(void) (&_x == &_y);使得,若是_x和_y的类型不同,其指针类型也会不同,2个不同的指针类型进行比较操做,则会引发编译器产生一个编译警告,提示 你这两个值的类型不一样。函数

好比,若是你编译下面这段代码:spa

  1. int x = 2;  
  2. char y = 3;  
  3. int m;  
  4. m = min(x,y);  

编译的时候,通过预处理后,就会有这样的判断操做:.net

int * == char *;unix

所以编译器就会提示你:指针

warning: comparison of distinct pointer types lacks a casthtm

因此,这个宏的巧妙之处就在于此。blog

因此,总结起来就是:

【提示】

1。其实关于min的宏,更好的作法是再加个const,即:

  1. #define min(x, y) ({ \  
  2. const typeof(x) _x = (x); \  
  3. const typeof(y) _y = (y); \  
  4. (void) (&_x == &_y); \  
  5. _x < _y ? _x : _y; })  

2。(void) (&_x == &_y); 中的void,表示将表达式(&_x == &_y); 所获得的结果(此处确定是逻辑上的假,值为0)忽略掉。若是不加void,则会提示你这行代码是无心义的,没人用到。

3。关于min的宏定义,为什么这么复杂,而不是用简单的#define min(x,y) ((x) < (y) ? x : y)

由于,若是如此定义,那么对于一些特殊的值传入此宏以后,就会产生一些反作用,产生的结果,就不是咱们想要的了,好比:

  1. min(++a,++b) ==> ((++a)<(++b))?(++a) : (++b)   
就使得,a++和b++分别执行了2次,并且min的结果,也不对了。而用上面那个复杂的定义,多加了局部变量_x和_y,就能够避免此类问题了。

【引用】

1。(void) (&_x == &_y);

2。以下的宏定义中(void) (&_x == &_y);是怎么作到判断类型的?

http://linux.chinaunix.net/bbs/viewthread.php?tid=1161263

3。Linux内核中的Min和Max函数

http://www.armfans.net/thread-1527-1-1.html

相关文章
相关标签/搜索