Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5773625
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2008-10-12 23:34:05

最近在火车上读王咏刚的《凌波微步--软件开发警戒案例集》,
里面讲到了assert的问题,之前没有意识到这个问题。

按照VC下面的说法是Debug版和Release版的编译差别,会导致出现问题。
assert(exp),中当表达式exp为假时,assert()宏调用系统调用函数输出错误函数,终止程序的执行。

这里列出linux下assert.h中的定义:

/* void assert (int expression);
   If NDEBUG is defined, do nothing.
   If not, and EXPRESSION is zero, print an error message and abort.  */
#ifdef    NDEBUG
# define assert(expr)        (__ASSERT_VOID_CAST (0))

也就是说在定义了NDEBUG,在VC里面就是Release版编译,assert(expr)就会变为assert(0)。

这里举一个例子:
assert( fread(buf, 1024, 8 fp) == 8 )

这句话在Debug和Release版中将会产生很大的差异。因为在编译Release版本时,fread这一句被替换为空语句,程序少了一次读取数据的操作,BUG就产生了。

assert()只能用于用于检查程序的运行状态,而不能用于对于程序运行状态有影响的任何操作性语句。
阅读(1009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~