分类: C/C++
2008-05-12 19:02:15
主要是为了在预处理时找出type不匹配的问题,而不是等到编译通过了程序执行的时候出错再来找问题
看这里的时候没理解到#define min(x,y) ((x) < (y) ? (x) : (y)) 为什么是不安全的?
? : 展开就是if(x
假如给的x变量为a++,y变量为b时,这里执行表达式a
a的值将计算一次为a+1,如果返回为 a++,返回值为a+1,但返回后实际上a的值已经为a+2了
GNU C 把包含在括号中的复合语句看做是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方,你可以在语句表达式中使用循环、局部变量等,原本只能在复合语句中使用。例如:
include/linux/kernel.h
159: #define min_t(type,x,y) \
160: ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
net/ipv4/tcp_output.c
654: int full_space = min_t(int, tp->window_clamp, tcp_full_space(sk));
({...})的作用是将内部的几条语句中最后一条的值返回
复合语句的最后一个语句应该是一个表达式,它的值将成为这个语句表达式的值。这里定义了一个安全的求最小值的宏,在标准 C 中,通常定义为:
#define min(x,y) ((x) < (y) ? (x) : (y))
这个定义计算 x 和 y 分别两次,当参数有副作用时,将产生不正确的结果,使用语句表达式只计算参数一次,避免了可能的错误。语句表达式通常用于宏定义。