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,程序才可以继续运行,否则程序中止,给出出错信息。

所以运行上面的程序的结果:

可以看出,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\n",exp,file,line);     abort(); }

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

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

运行结果:

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

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

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

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

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

2,abort();

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

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

assert实现的更多相关文章

  1. C 标准库系列之assert.h

    先简单介绍一下<assert.h>头文件,该头文件的目的便是提供一个宏assert的定义,即可以在程序必要的地方使用其进行断言处理:断言在程序中的作用是当在调试模式下时,若程序给出的前提条 ...

  2. java分享第十四天(TestNG Assert详解)

     TestNG Assert 详解org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参 ...

  3. TestNG Assert 详解

    org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参数类型及参数个数,double 3 ...

  4. junit4 assert类中的assert方法总结

    junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类. 1.assertTrue/False([String message,]boolean cond ...

  5. 断言(Assert)与异常(Exception)

    断言是被用来检查非法情况而不是错误情况,即在该程序正常工作时绝不应该发生的非法情况,用来帮助开发人员对问题的快速定位.异常处理用于对程序发生异常情况的处理,增强程序的健壮性.容错性,减少程序使用中对用 ...

  6. assert_option()可以用来对assert()进行一些约束和控制

    一.evaleval用法:eval() 函数把字符串按照 PHP 代码来计算.该字符串必须是合法的 PHP 代码,且必须以分号结尾.如果没有在代码字符串中调用 return 语句,则返回 NULL.如 ...

  7. java 关键字 assert的学习

    之前在学习java源码时,发现了assert这个不常用的关键字.下面直接来介绍下这个关键字的使用. assert是什么? 它是jdk1.4之后新增加的关键字,没了. assert的作用是什么? ass ...

  8. devenv.exe assert failure

    使用vs2010,创建mvc2 web application项目,编译之后,调试报错 https://www.asp.net/mvc/overview/older-versions-1/gettin ...

  9. (转)assert 断言式编程

    编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在任何时候启用 ...

  10. selenium提供了三种模式的断言:assert,verify,waitfor

    Assert:失败时,该测试将终止 Verify:失败时,该测试继续执行,并将错误日志记录在日显示屏 Waitfor:等待某些条件变为真,一般使用在AJAX应用程序的测试 断言常用的有,具体见如下:a ...

随机推荐

  1. HADOOP:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable终于解决了

    WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin- ...

  2. Spring中使用log4j随笔

    web.xml中的配置: <!--由Sprng载入的log4j配置文件位置--> <context-param> <param-name>log4jConfigLo ...

  3. [Android] 混音器AudioMixer

    AudioMixer是Android的混音器,通过混音器可以把各个音轨的音频数据混合在一起,然后输出到音频设备. 创建AudioMixer AudioMixer在MixerThread的构造函数内创建 ...

  4. java代码调用rtx发送提醒消息

    http://www.cnblogs.com/qstar/archive/2012/02/03/Astar.html 借用一下!好东西

  5. -_-#【JS】HTML5 API

    <JavaScript高级程序设计(第3版)> <!DOCTYPE html> <html> <head> <meta charset=" ...

  6. Word Ladder——LeetCode

    Given two words (start and end), and a dictionary, find the length of shortest transformation sequen ...

  7. Java-单机版的书店管理系统(练习设计模块和思想_系列汇总)

    介绍: 本软件系列到此,我已经全部写完了. 项目练习目标 : 1.Java应用程序基本分析 2.培养面向对象编程的基本思想 3.Java基本设计模式综合应用 4.掌握分层和接口的基本设计 5.构建合理 ...

  8. <一>初探js特效魅力之选项卡05

    初探js特效魅力05 接下来为大家介绍的选项卡的切换 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...

  9. [置顶] Hibernate运行机理

    Hibernate 的缓存体系 一级缓存: Session 有一个内置的缓存,其中存放了被当前工作单元加载的对象. 每个Session 都有自己独立的缓存,且只能被当前工作单元访问. 二级缓存: Se ...

  10. jquery动态添加元素无法触发绑定事件的解决方案。

    jquery动态添加元素无法触发绑定的事件的解决方案. ╭(●`∀´●)╯二狗最近在工作中遇到一个问题,即当用jquery动态添加元素后,发现给动态添加的元素却无法触发事件(╯#-_-)╯╧═╧ ( ...