在看<assert.h>的实现时,学到了一些宏的深层的属性,记录一下:
宏不能直接调用库的任何输出函数,而且宏必须可以扩展为一个void类型的表达式。但是它可以通过调用隐藏的
库函数来实现输出,如在<assert.h>的实现中,assert宏就是通过调用 隐藏库函数_Assert来实现的,具体如下:
#define assert(test) ((test) ? (void)0 : _Assert (_FILE_ ":" _STR(_LINE)""#test))
具体的_Assert实现如下
void _Assert(char *msg)
{
fputs(msg,stderr);
fputs(" --assertion failed\n",stderr);
abourt();
}