assert宏 (基本概念与用法整理)
2012-11-13 21:26
573 查看
assert宏 (基本概念与用法整理)
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h> void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行
#include <stdio.h> //#define NDEBUG #include <assert.h> int main() { printf("hello\n"); assert(0); printf("world\n"); assert(1); return 0; }
基本概念:
1.头文件<assert.h>唯一的目的就是提供宏assert的定义。
2.宏assert没有任何返回值。
3.要打开断言可以这样写:
#undef NDEBUG
#include <assert.h>
要关闭断言,可以这样写:
#define NDEBUG
#include <assert.h>
4.频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。
5.头文件assert.h定义的宏受NDEBUG的影响.如果预程序在处理这个头文件时已经定义了NDEBUG,assert宏的内容就定义为空,这意味着assert宏不在起作用.所以,可以在最终发布程序的时候可以使用-DNDEBUG关闭断言功能或者把#define NDEBUG加到每个源文件中,但这条语句必须放在#include <assert.h>之前。
基本用法与注意事项:
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和后面的语句应空一行,以形成逻辑和视觉上的一致感。
5)有的地方,assert不能代替条件过滤。
assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。
一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。
总结:
assert不是一个仓促拼凑起来的宏,为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。 以下是使用断言的几个原则: 1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。 2)使用断言对函数的参数进行确认。 3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。 4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。
上次修改时间:2012-11-15
相关文章推荐
- GIT基本概念和用法总结
- 【转载】HBase基本概念和hbase shell常用命令用法
- 【数据挖掘】分类基本概念(没整理)
- 视图控制器基本概念和用法
- 读书摘要 C primer plus 指针的基本用法和一些需要清楚的概念(1)
- [SOA资料整理]1、SOA的基本概念
- GIT基本概念和用法总结
- 通信中的基本概念(慢慢整理)
- 浅谈SQL基本概念及其用法
- 深入理解 Laravel Eloquent(一)——基本概念及用法
- Git的基本概念和用法
- iOS App开发中UISearchBar搜索栏组件的基本用法整理
- IOS UI初级-触摸与手势的基本概念和用法
- VB 学习整理1 基本概念 数据类型
- 导航控制器的基本概念和用法
- CheckBoxList控件基本用法 如何给DropDownList控件添加边框[整理]
- C++中常问道一些基本概念整理
- 浅谈SQL基本概念及其用法
- Elasticsearch学习总结一 基本用法及概念
- C/C++ %s %d %u 基本概念与用法