assert预处理宏总结
2016-03-28 20:48
344 查看
1、除了assert预处理宏之外,现代C++程序很少再使用预处理宏了;
2、功能: 测试一个条件并可能使程序终止,用法是:assert(expr),assert的作用是先计算表达式expr,如果其值为假(即为0),那么它会输出信息并终止程序的执行,其实就相当于一个if语句:
但是这样写的话,就会有无数个if语句,甚至会出现,一个if语句的括号从文件头到文件尾,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了assert();
3、assert是宏,而不是函数,定义在在C++的cassert头文件中;
4、宏assert()一般用于确认程序的正常操作,其中表达式构造无错时才为真值;
5、使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销;
6、完成调试后,不必从源代码中删除assert()语句,因为宏NDEBUG有定义时,宏assert()的定义为空,即可以通过在包含#include assert.h>或#include< csaaert >的语句之前插入 #define NDEBUG 来禁用assert调用:
7、assert只有在Debug版本中才有效,如果编译为Release版本则被忽略(程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用);
8、用法注意事项:
(1)在函数开始处检验传入参数的合法性;
(2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,举例:
(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()断言机制原理以及使用
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) | 好 |
错误: 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()断言机制原理以及使用
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性