Tanky WooRSS

关于C++中断言assert的转载及汇总

20 Sep 2011
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

首先看MSDN上的解释:

Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program.

void assert( 
   int expression 
);

断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。

通常当我们使用assert时,都在强烈说明一个含义:在这里必然如此。即assert是指你绝对确信不可能会发生的事

摘录林锐博士高质量编程一书中相关内容。 ~~~~~~~~~~~~~~~~~~~~~~~~ 程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。 断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。

void memcpy(void *pvTo, void *pvFrom, size_t size) 
{ 
    void *pbTo = (byte *) pvTo;
    void *pbFrom = (byte *) pvFrom; 
    assert( pvTo != NULL && pvFrom != NULL ); 
    while(size-- > 0 ) 
        *pbTo++ = *pbFrom++ ; 
    return (pvTo); 
} 

assert不是一个仓促拼凑起来的宏,为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。 以下是使用断言的几个原则: 1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。 2)使用断言对函数的参数进行确认。 3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。 4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

网上还有一篇关于“断言”的大师级文章:

http://blog.csdn.net/zxcred/article/details/3239883

其他一些参考链接:

http://zhidao.baidu.com/question/119204684.html

http://topic.csdn.net/t/20040922/15/3398499.html

http://topic.csdn.net/t/20040718/20/3186411.html

http://bbs.chinaunix.net/thread-1185312-1-1.html