教你写一个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

assert宏的实现

在看《编写高质量的C语言代码》中第二章提到,使用断言,于是翻出以前看过的《C标准库》查看assert宏的实现。 这篇文章主要内容来自 《C标准库》 1. 头文件中除了定义宏assert以外还...
  • zhccl
  • zhccl
  • 2012年08月22日 16:19
  • 5071

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

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

C语言再学习-- assert 断言宏

描述: 断言 assert 是仅在 Debug 版本起作用的宏,它用于检查“不应该”发生的情况。 C 库宏 void assert(int expression) 允许诊断信息被写入到标准错误文件...
  • qq_29350001
  • qq_29350001
  • 2017年01月15日 14:07
  • 1445

assert()宏用法总结

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include assert.h> void assert( int expression );   ...
  • CATHY_AA
  • CATHY_AA
  • 2017年04月07日 13:51
  • 269

assert预处理宏总结

1、除了assert预处理宏之外,现代C++程序很少再使用预处理宏了;2、功能: 测试一个条件并可能使程序终止,用法是:assert(expr),assert的作用是先计算表达式expr,如果其值为假...
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016年03月28日 20:48
  • 1187

assert宏的用法及原理

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include void assert( int expression ); assert的作用是现计算表达...
  • liangkaiming
  • liangkaiming
  • 2010年09月21日 16:03
  • 4259

判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别

判断一个指针是否为空//vs20051. abort()#include//...if(!ptr) abort();2. assert#include//....assert(ptr!=0);//as...
  • wangjiwei2010
  • wangjiwei2010
  • 2007年04月10日 11:22
  • 2545

一个优秀的debug函数(宏)

调试用的宏debug函数(宏),可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码: //t.c #include #def...
  • ZHONGkunjia
  • ZHONGkunjia
  • 2016年04月24日 10:26
  • 1700

[C++]NDEBUG宏与assert行为

[C++]NDEBUG宏与assert行为 2010-06-30 18:33 1461人阅读 评论(0) 收藏 举报 c++编译器gccc   NDEBUG宏是Stan...
  • jiafu1115
  • jiafu1115
  • 2013年09月23日 13:44
  • 4080

自己写的一个ASSERT宏

//带返回值的ASSERT#define R_ASSERT(EXP, RET)/    if (!(EXP)){/UB_LOG_WARNING("R_ASSERT(%s) failed! file:%...
  • itegel84
  • itegel84
  • 2011年02月14日 11:21
  • 392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:教你写一个C的assert宏
举报原因:
原因补充:

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