assert宏的实现(一道笔试题) assert宏其实很重要,对于调试程序来说。 如果你说你精通C/C++,然后面试官让你写个assert宏的实现,你却写不出来,甚至都不曾经用过,那面试官 对你的评价一下就降低了很多。 assert其实很简单,它就是为了确定一个条件为真,如果不为真,则给出出错信息,并且中止程序。 所以assert也叫断言。 例如如下程序: #include <assert.h> int main() 如果需要用到assert需要包括头文件assert.h. 这里assert(i!=100);就是确保i不等于100,程序才可以继续运行,否则程序中止,给出出错信息。 所以运行上面的程序的结果: 可以看出,assertion failed.也就是断言失败, i!=100,是你的断言,它失败了,所以这里说明i==100, 后面就是assert()这个宏失败所在的文件和行数。 下面我们把assert.h这个头文件去掉,自己写个assert()宏的实现,加深理解断言宏。 #include <stdio.h> int main() 程序如上,你运行会发现和上面使用assert.h头文件的程序的运行结果格式一样,说明实现了assert()宏。 运行结果: 这里的实现主要注意以下几点: 1,(void)((exp)||(_assert(#exp,__FILE__,__LINE__),0)) 这里利用了||的短路性质,就是条件为真,它就不执行后面的了,为假才执行。 #exp会在预处理产生一个字符串,也就是上面的i!=100. __FILE__,__LINE__,分别表示文件位置和行数。 2,abort(); 这个函数是一个内部函数,它就是异常中止你运行的程序。图片中的红叉Debug Error!的出现,就是因为调 用了这个程序,把它去掉,就不会出现了。 |
|