您的位置:首页 > 编程语言 > C语言/C++

C/C++ assert使用

2015-02-10 16:35 337 查看
首先,assert是一个宏,而不是函数,看一个VS中<assert.h>中的定义

#include <crtdefs.h>

#undef  assert

#ifdef  NDEBUG

#define assert(_Expression)     ((void)0)

#else

#ifdef  __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);

#ifdef  __cplusplus
}
#endif

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

#endif  /* NDEBUG */


可见,在使用assert()时,如果未定义NDEBUG,则会使用#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

而定义NDEBUG ,则会替换为((void)0) ,即相当于断言不起作用。

故在调试中可以使用asset判断表达式的真假,而在以后的使用中,为了屏蔽断言,可以在包含的头文件<assert.h>前面,加上

#define NDEBUG


而assert的使用,则就很简单了,只要括号中的表达式为真,则程序正常运行,而一旦括号中的表达式为假,则程序会输出相应的文件名,在哪一行断言出错了等信息,然后程序会调用abort()中止程序运行。

具体的用法例子,可见http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html

文中还提到了两个注意的地方

(1):每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

(2):不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: