c,assert 宏的实现
预备知识:
#define _VAL(x) #x //#x的作用就是把x表达式变成一个字符串。(注意 : 不带换行符'\n' , 换行符ascii==10)。
如:_STR(i<100)
printf("%s\n" , _STR(i<100)) ;会在终端打印 i<100。
下面来实现assert宏,和标准库的同样功能,可打印出错的”文件、行、表达式“:
//massert.c
#include "massert.h"
#include <stdlib.h>
#include <stdio.h> void _mAssert(char * mesg)
{
fputs(mesg, stderr);
fputs("--assertion failed\n", stderr);
abort();
}
//massert.h
#ifndef NDEBUG
extern void _mAssert(char *);
#define _STR(x) _VAL(x)
#define _VAL(x) #x
#define massert(test) \
((test)? (void) : _mAssert(__FILE__ ":" _STR(__LINE__) " " #test))
#else
#define massert(test)
#endif
//demo1.c
#include "massert.h" int func1(int i )
{
massert(i<);
return *i;
}
//demo2.c
#define NDEBUG
#include "massert.h" int func2(int i )
{
massert(i<);
return *i;
}
//demo.c
#include <stdio.h> extern int func2(int i );
extern int func2(int i ); int main()
{
if(){
printf("11111\n");
func1();
printf("22222\n");
func1();
}else{
printf("33333\n");
func2();
printf("44444\n");
func2();
}
return ;
}
//终端打印结果:
//if(1) demo1.c: i<--assertion failed
Aborted
//if(0)
实现了assert宏,和标准库的同样功能。可打印出错的”文件、行、表达式“。
没有系统的时候,怎么实现一个assert?
//massert, 当出现test的情况,报错并返回error_code
#define _STR(x) _VAL(x)
#define _VAL(x) #x
#define massert(test, error_code)\
if((test)){\
printf("In file "__FILE__ ",Line " _STR(__LINE__) "," #test"\n");\
return error_code;\
} int main()
{
massert(>, 0xff);
massert(->, 0xff);
return ;
}
//In file main.c,Line 13,1>0
c,assert 宏的实现的更多相关文章
- ASSERT_VALID和ASSERT宏分析
这个宏都是MFC的调试宏. ASSERT_VALID宏用来在运行时检查一个对象的内部合法性,比如说现在有一个学生对象,我们知道每个学生的年龄一定大于零,若年龄小于零,则该学生对象肯定有问题. 事实上, ...
- (四)静态断言(上),assert,NDEBUG, 以及通过宏定义处理文件包含关系
一.断言:运行时与预处理时 断言(assertion)是一种编程常用的手段.想必大家都见过 assert 吧.今天我们就来了解一下它. 通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中, ...
- 特殊用途语言特性(默认实参/内联函数/constexpr函数/assert预处理宏/NDEBUG预处理变量)
默认实参: 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 需要特别 ...
- assert增强宏的实现
作者:朱金灿 来源:http://blog.csdn.net/clever101 标准c的assert宏和MFC的ASSERT宏都不支持输出太多的信息.今天实现了一个assert增强宏,可以输出更多的 ...
- C 标准库系列之assert.h
先简单介绍一下<assert.h>头文件,该头文件的目的便是提供一个宏assert的定义,即可以在程序必要的地方使用其进行断言处理:断言在程序中的作用是当在调试模式下时,若程序给出的前提条 ...
- (转)assert 断言式编程
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在任何时候启用 ...
- 断言(assert)的用法
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”. 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解 ...
- scala 宏
Scala开发团队正在将实验版宏指令加入到即将发行的2.10版中.Scala宏指令提供了编译时元编程的高级形式.Scala宏网站描述道: “宏指令显著简化了代码分析和代码生成,这使得它们成为处理大量现 ...
- 断言(ASSERT)的用法
ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继续执行后面的语句.这个宏通常原来判 ...
随机推荐
- HDU 4569 Special equations (数学题)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4569 题意:给你一个最高幂为4的一元多项式,让你求出一个x使其结果模p*p为0. 题解:f(x)%(p ...
- Hat’s Words(字典树)
Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Android学习笔记(十五)——碎片的生命周期(附源代码)
碎片的生命周期 点击下载源代码 与活动类似.碎片具有自己的生命周期.理解了碎片的生命周期后.我们能够在碎片被销毁时正确地保存事实上例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Frag ...
- Android_Dialog_设置Dialog窗体的大小
/** * 设置Dialog窗体的大小 */ private void setWindowSize() { DisplayMetrics dm = new DisplayMetrics(); Wind ...
- Android Material Design-Creating Apps with Material Design(用 Material Design设计App)-(零)
转载请注明出处:http://blog.csdn.net/bbld_/article/details/40400031 翻译自:http://developer.android.com/trainin ...
- openstack 入门1
介绍 Rackspace & NASA软件开源项目的组合安装配置复杂基础设施资源的系统管理平台 (网络,计算,存储)个人打井 vs 自来水厂 组件&原理 Horizon -- UI模块 ...
- Qt 错误: 无法运行 release 下的可执行文件
学习Qt有一点时间了,但之前都是在debug版本下进行编译运行,偶然切换到release版本下,却出现了如下错误: 错误提示: This application failed to sta ...
- Python web框架有哪些
简单易学的web.py, 大型的django:文档最完善.市场占有率最高.招聘职位最多. Tornado 具体看:http://feilong.me/2011/01/talk-about-python ...
- Java简单记录
XML指令: <?xml version="1.0" encoding="UTF-8" standalone="no" ?> & ...
- [NOIP 2005]-- 篝火晚会
额~~,对这组题感兴趣的具体的解题报告可以戳戳这里:http://wenku.baidu.com/view/878beb64783e0912a2162aa7.html?qq-pf-to=pcqq.c2 ...