摘自P.J.Plauger's 《The Standard C Library》
c89标准共有15个头文件,这是最简单的一个。
如果NDEBUG宏定义的话,断言从此不再起作用。
<assert.h>
assert.h的实现
------------------------------------------------------------------------
/* assert.h standard header */
#undef assert //remove existing definition
#ifdef NDEBUG
#define assert(test) ((void)0)
#else
void _Assert(char *)
#define _STR(x) _VAL(x)
#define _VAL(x) #x
#define assert(test) ((test) ? (void)0 /
:_Assert(__FILE__":"_STR(__LINE__)""#test))
#endif
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
xassert.c
--------------------------------------------------------------------------
// _Assert function
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
void _Assert(char * mesg)
{
fputs( mesg,stderr);
fputs(" --assertion failed/n", stderr);
abort();
}
----------------------------------------------------------------------------
关于宏_STR _VAL
因为__LINE__宏没有扩展成字符串变量,它变成了一个十进制常量。因而需要额外的处理。
一个用十进制常量扩展来取代__LINE__,另一个将十进制常量转换成字符串字面量。