assert预处理宏总结

来源:互联网 发布:淘宝怎么买爱奇艺会员 编辑:程序博客网 时间:2024/05/21 06:10

1、除了assert预处理宏之外,现代C++程序很少再使用预处理宏了;

2、功能: 测试一个条件并可能使程序终止,用法是:assert(expr),assert的作用是先计算表达式expr,如果其值为假(即为0),那么它会输出信息并终止程序的执行,其实就相当于一个if语句:

if(假设成立){     程序正常运行;//Do nothing!}else{      报错&&终止程序!(避免由程序运行引起更大的错误)//Do something!  }

但是这样写的话,就会有无数个if语句,甚至会出现,一个if语句的括号从文件头到文件尾,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了assert();

3、assert是宏,而不是函数,定义在在C++的cassert头文件中;

4、宏assert()一般用于确认程序的正常操作,其中表达式构造无错时才为真值;

5、使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销;

6、完成调试后,不必从源代码中删除assert()语句,因为宏NDEBUG有定义时,宏assert()的定义为空,即可以通过在包含#include assert.h>或#include< csaaert >的语句之前插入 #define NDEBUG 来禁用assert调用:

#include <iostream>#define NDEBUG#include <cassert>

7、assert只有在Debug版本中才有效,如果编译为Release版本则被忽略(程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用);

8、用法注意事项:
(1)在函数开始处检验传入参数的合法性;
(2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,举例:

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize) 不好 assert(nOffset >= 0);assert(nOffset+nSize <= m_nInfomationSize)

(3)不能使用改变环境的语句,因为assert只在DEBUG生效,如果这么做,会使用程序在真正运行时遇到问题,例如:
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100)
i++;
(4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感;

9、assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。C/C++语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。

参考资料:
1、assert预处理宏与预处理变量
2、断言(ASSERT)的用法
3、assert函数和捕获异常
4、C++技巧之断言Assert
5、c++ assert() 使用方法
6、什么时候该用ASSERT?
7、C++ Assert()断言机制原理以及使用

0 0
原创粉丝点击