关闭

教你写一个C的assert宏

标签: cfile2010
443人阅读 评论(0) 收藏 举报
分类:
在C中 , 相信assert这个断言是用的最频繁的宏之一,特别是在我们找BUG的时候,多用一些断言可以让我们更靠近出错的代码,不多说,进入我们的主题,写出一个assert宏来。

  首先我们都知道,assert在debug版下是有效的,在release版中assert是无效的,那么我们应该如何实现这一功能呢?实际上在release的版本中系统定义了NDBUG这个宏常量,当然在debug中没有定义这个宏常量,所以在定义这个宏之前检查是否定义过NDBUG这个宏就可以知道是debug版还是release版了,见下面的代码:

#if !defined(NDBUG)
  #define assert(p)        /*这里写上宏的代码*/    
  #else
  #define assert(p) 
  #endif


 

现在我们继续实现的assert , 我们都知道断言要是失败了,要输出失败位置所在文件的文件名 , 和行号 , 当然输出应该重定向到标准出错里面。

 

__FILE__记录了当前执行的文件名。

__LINE__记录当前执行的行号。

stderr是标准出错。

当然断言要是失败的话 , 调用abort终止程序的执行 , 代码实现如下。

 

#if !defined(NDBUG)
  #define assert(p)    if(!(p)){fprintf(stderr,\
         "Assertion failed: %s, file %s, line %d\n",\
         #p, __FILE__, __LINE__);abort();}     
  #else
  #define assert(p) 
  #endif


 

好了一个C的assert宏就完成了。

 

转自:http://www.cnblogs.com/kanong/archive/2010/09/11/1824002.html

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:126518次
    • 积分:1518
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:91篇
    • 译文:0篇
    • 评论:9条
    最新评论