assert高级用法

来源:互联网 发布:java 二分法 编辑:程序博客网 时间:2024/05/23 10:43

很少有比跟踪到程序的断言,却不知道该断言的作用更让人沮丧的事了。你化了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么。有的时候,程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。幸运的是这个问题很好解决,只要加上清晰的注释即可。这本是显而易见的事情,可是很少有程序员这样做。这好比一个人在森林里,看到树上钉着一块“危险”的大牌子。但危险到底是什么?树要倒?有废井?有野兽?除非告诉人们“危险”是什么,否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略,甚至被删除。

【规则6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
【规则6-5-2】在函数的入口处,使用断言检查参数的有效性(合法性)。
【建议6-5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
【建议6-5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

ASSERT宏中应该包含的元素:

判断条件;输出当前断言失败的位置(文件、行数等);返回错误;终止程序...

几种典型的ASSERT的写法:

VC中的写法:

#define ASSERT(f) \
do \
{ \
   if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
   AfxDebugBreak(); \
} while (0) \

#define _ASSERT(expr) \
        do { if (!(expr) && \
                (1 == _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, NULL, NULL))) \
             _CrtDbgBreak(); } while (0)

其他平台的写法:

# define ASSERT(x) ((x) || (dbg_printf("assertion failed ("__FILE__":%d): \"%s\"\n",__LINE__,#x), break_point(), FALSE))

#Debug

-------------------------其实就是自己封装了一个Assert,系统提供的是直接abort(),但这种方式可能不是我们想要的,比如我们希望发生了不该发生的情况时不是终止程序运行而是打印错误信息,那么就自己写一个吧。
0 0
原创粉丝点击