最近在火车上读王咏刚的《凌波微步--软件开发警戒案例集》,
里面讲到了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) |