ASSERT

来源:互联网 发布:51单片机循迹小车 编辑:程序博客网 时间:2024/06/06 04:19
下面是一种用户自己定义宏 ASSERT 的方法:

#ifdef DEBUGvoid _Assert(char* , unsigned); //原型#define ASSERT(f) \if(f) \    NULL; \else \    _Assert(__FILE__ , __LINE__)#else#define ASSERT(f) NULL#endif

从中我们可以看到,如果定义了 DEBUG,ASSERT 将被扩展为一个 if 语句。if 语句中的
NULL 语句让人感到很奇怪,这是因为要避免 if 不配对,所以它必须要有 else 语句。也许
读者认为在_Assert 调用的闭括号之后需要一个分号,但并不需要。因为用户在使用
ASSERT 时,已经给出了一个分号.
当 ASSERT 失败时,它就使用预处理程序根据宏__FILE__和__LINE__所提供的文件名
和行号参数调用_Assert。
_Assert 在标准错误输出设备 stderr 上打印一条错误消息,然后
中止:

void _Assert(char* strFile, unsigned uLine){    fflush(stdout);    fprintf(stderr, “\nAssertion failed: %s, line %u\n”,strFile, uLine);    fflush(stderr);    abort();}

在执行 abort 之前,需要调用 fflush 将所有的缓冲输出写到标准输出设备 stdout 上。
同 样 , 如 果 stdout 和 stderr 都 指 向 同 一 个 设 备 , fflush stdout 仍 然 要 放 在 fflush
stderr 之前,以确保只有在所有的输出都送到 stdout 之后,fprintf 才显示相应的错误信
息。
0 0
原创粉丝点击