一、什么是assert()?
编写代码时,我们总是会做出一些假设,断言(assert)就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
注意assert()是一个宏,而不是函数。
二、assert怎么用?
1、assert所在的头文件及原型
在MinGW工具中,assert()宏在存在于头文件assert.h中,其关键内容如下:
#ifdef NDEBUG#define assert(x)((void)0)#else /* debugging enabled */_CRTIMP void __cdecl __MINGW_NOTHROW _assert (const char*, const char*, int) __MINGW_ATTRIB_NORETURN;#define assert(e) ((e) ? (void)0 : _assert(#e, __FILE__, __LINE__))#endif/* NDEBUG */
assert()宏接受一个整形表达式参数。如果表达式的值为假,assert()宏就会调用_assert函数在标准错误流中打印一条错误信息,并调用abort()(abort()函数的原型在stdlib.h头文件中)函数终止程序。
当我们认为已经排除了程序的bug时,就可以把宏定义#define NDEBUG写在包含assert.h位置前面。
小知识:
- __cdecl是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈。
- _CRTIMP是C run time implement的简写,C运行库的实现的意思。作为用户代码,不应该使用这个东西。提示是使用dll的动态 C 运行时库还是静态连接的 C 运行库的一个宏。
#ifndef _CRTIMP#ifdef _DLL#define _CRTIMP