教你写一个C的assert宏

转载 2012年03月23日 15:28:28
在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

C/C++ 中的assert()宏 断言机制

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断...

C/C++ 中的assert()宏 断言机制 (转)

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断...

C/C++ 中的assert()宏 断言机制

C/C++ 中的assert()宏 断言机制  (2011-11-07 19:47:57) 转载▼ 标签:  c/c   中的assert()宏   ...

assert是一个预处理宏

assert是一个预处理宏

Objective-C——教你如何用X-code创建一个OC程序

教你如何用X-code创建一个OC程序———- android培训、java培训、期待与您交流! ———-教你如何用X-code创建一个OC程序 打开Xcode软件 选择创建什么样的工程 填写工程名称...

手把手教你写Linux I2C设备驱动

Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片、音视频采集芯片、音...
  • Cowena
  • Cowena
  • 2015年08月30日 09:07
  • 631
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:教你写一个C的assert宏
举报原因:
原因补充:

(最多只允许输入30个字)