Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244534
  • 博文数量: 49
  • 博客积分: 2591
  • 博客等级: 少校
  • 技术积分: 515
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-15 00:03
文章分类

全部博文(49)

文章存档

2009年(3)

2008年(46)

我的朋友

分类: 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 分别两次,当参数有副作用时,将产生不正确的结果,使用语句表达式只计算参数一次,避免了可能的错误。语句表达式通常用于宏定义。

阅读(1769) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~