zoukankan      html  css  js  c++  java
  • 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!的出现,就是因为调

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

  • 相关阅读:
    swt 更新主UI线程
    java中 快捷键输入System.out.println();
    原型设计工具
    JAVA笔记
    转:java读取配置文件的几种方法
    Server Message Block
    安全标识符
    BitLocker:如何启用网络解锁
    imageX.exe
    组策略首选项
  • 原文地址:https://www.cnblogs.com/lirong21/p/3923019.html
Copyright © 2011-2022 走看看