assert实现

assert宏的实现(一道笔试题)  

2010-11-09 13:05:48|  分类: c |  标签: |举报 |字号 订阅

 
 
assert宏的实现(一道笔试题)
 

assert宏其实很重要,对于调试程序来说。

如果你说你精通C/C++,然后面试官让你写个assert宏的实现,你却写不出来,甚至都不曾经用过,那面试官

对你的评价一下就降低了很多。

assert其实很简单,它就是为了确定一个条件为真,如果不为真,则给出出错信息,并且中止程序。

所以assert也叫断言。

例如如下程序:

#include <assert.h> #include <stdio.h>

int main() { int i = 100; assert(i!=100); return 0; }

如果需要用到assert需要包括头文件assert.h.

这里assert(i!=100);就是确保i不等于100,程序才可以继续运行,否则程序中止,给出出错信息。

所以运行上面的程序的结果:assert宏的实现(一道笔试题) - dsyunix - Spring

可以看出,assertion failed.也就是断言失败, i!=100,是你的断言,它失败了,所以这里说明i==100,

后面就是assert()这个宏失败所在的文件和行数。

下面我们把assert.h这个头文件去掉,自己写个assert()宏的实现,加深理解断言宏。

#include <stdio.h>
#define assert(exp) (void)((exp)||(_assert(#exp,__FILE__,__LINE__),0)) void _assert(void * exp, void * file, unsigned int line) {     printf("Assertion failed: %s, file %s, line %d ",exp,file,line);     abort(); }

int main() { int i = 100; assert(i!=100); return 0; }

程序如上,你运行会发现和上面使用assert.h头文件的程序的运行结果格式一样,说明实现了assert()宏。

运行结果:

assert宏的实现(一道笔试题) - dsyunix - Spring

这里的实现主要注意以下几点:

1,(void)((exp)||(_assert(#exp,__FILE__,__LINE__),0))

这里利用了||的短路性质,就是条件为真,它就不执行后面的了,为假才执行。

#exp会在预处理产生一个字符串,也就是上面的i!=100.

__FILE__,__LINE__,分别表示文件位置和行数。

2,abort();

这个函数是一个内部函数,它就是异常中止你运行的程序。图片中的红叉Debug Error!的出现,就是因为调

用了这个程序,把它去掉,就不会出现了。

原文地址:https://www.cnblogs.com/lirong21/p/3923019.html