断言宏常用于C++程序中。宏assert主要用于调试程序的过程中。在程序运行时,该宏会计算括号内的表达式,若表达式为false,程序将报告错误,并终止执行;若表达式不是false,则继续执行该语句后面的语句。宏assertion主要用于判断程序中是否出现明显非法数据,若出现了非法数据,即迅速终止程序,以免导致严重后果,这样还便于查找错误。使用断言assert()函数时,程序必须包含头文件<assert.h>。assert()函数用于评估其参数的值(非零或零),当参数expression为false时,程序会打印出检测到的信息,并终止(abort)程序的运行。例如,
使用assert()的缺点是会影响程序的性能,增加额外的开销。assert()函数并不受宏DE-BUG的限制。无论是程序的debug版本还是release版本,assert()函数均起作用,assert()函数能够及时查出编码的错误。很多错误的发生不都是在编译时发生的,而是运行时发生的,因此不能仅仅依赖assert(),更主要的是使用exception机制来检测运行时的错误,并采取相应的处理措施。
使用assert()函数时,程序员需要注意以下几个问题:
1)使用断言捕捉不应发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的,并且一定要采取处理措施。
2)使用断言时,程序员需要对函数的参数进行确认。
3)编写函数时,程序员要反复考查,对设定的假定需要使用断言进行检查。
4)通常程序员都熟悉部分防错性的程序设计,注意:此风格会隐瞒错误。当进行防错性编程时,若不可能发生的事情发生了,需要使用断言进行报警。
5)每个断言需要详细、清楚。
6)使用不同的算法对程序结果进行确认。
7)程序员应在错误发生之前使用初始检查程序。
在Visual Studio MSDN中指出,宏assert()函数典型的应用是识别逻辑错误。在程序开发过程中,当程序运行不正确时,参数expression会转变为错误(false)。当程序调试结束时,并需要不调整源文件,仅使用宏NDEBUG,断言检测可以无效。NDEBUG可以使用命令行选项/D定义或使用语句#define。如果NDEBUG使用#define形式定义之后,#define语句必须出现在头文件<assert.h>之前。当assert()函数的参数expression为false时,assert()函数会打印出检测信息并调用abort()函数来终止程序的执行。若函数的参数expression为true,则不会采取任何措施。检测信息包括错误的表达式、源文件的名字、assert()函数所在语句的行号等。(www.xing528.com)
在VisualC++2005版本中,检测信息是使用宽字符打印的。assert()函数可以按期望的情况工作,即使表达式是unicode characters的形式。
检测信息的目的仅仅在于检测应用程序的类型,该应用会调用进程。控制台程序总是接收来自于stderr的信息。在基于窗口的应用程序中,assert()函数会调用窗口MesageBox(),其目的是创建一个信息框来显示伴随【OK】按钮的信息对话框。当用户单击【OK】按钮时,程序迅速调用abort()函数,退出运行。
当应用程序链接debug版本的运行库时,宏断言assert()函数会使用3个按钮创建一个消息框:Abort、Retry和Ingore。如果用户单击【Abort】按钮,程序会迅速退出。如果用户单击【Retry】按钮,调试器会被调用,并且如果just-in-time调试有效,用户可以调试程序。如果用户单击【Ignore】按钮,断言assert()函数继续其正常执行——单击【OK】按钮创建信息框。提示:单击【Ignore】按钮时,如果错误条件存在,会导致不确定的行为。
未获取调试过程中的更多信息参见C运行库CRT调试技术的文档。下面举例说明assert()函数的使用方法。
例11-10
例11-10的执行结果如图11-1所示。
图11-1 例11-10的执行效果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。