首先,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判断表达式的真假,而在以后的使用中,为了屏蔽断言,可以在包含的头文件<