当前位置: 首页 > news >正文

头文件assert.h

头文件<assert.h>的目的就是提供宏assert的定义。在程序中可以用这个宏来断言,如果断言是真,则继续执行。如果断言为假,则在标准输入流中输出一条提示信息,并执行终止异常。

通过宏DEBUG控制断言是否有效:如果程序中包含<assert.h>的地方没有定义NDEBUG,则宏assert为活动形式;如果程序中包含<assert.h>的地方定义了NDEBUG,则宏assert为静止形式。即:

当存在

#define NDEBUG

#include <assert.h>

时,下面程序中出现的assert(x==y)不执行任何操作

当存在

#undef NDEBUG

#include <assert.h>

时,下面程序中出现的assert(x==y)不成立时会向输出错误并执行终止异常。

 

例1:

#define NDEBUG  //在取消声明以前的代码段中assert均为静止形式
#include <assert.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static int val=0;

static void field_abort(int sig)
{
if(val==1)
{
puts("SUCCESS TESTING <assert.h>");
exit(EXIT_SUCCESS);
}
else
{
puts("FAILURE TESTING <assert.h>");
exit(EXIT_FAILURE);
}
}

static void dummy()

{
int i=0;

assert(i==0);
assert(i==1);  //assert为静止形式,故不会发生异常。
}

#undef NDEBUG  //取消NDEBUG声明,在define NDEBUG以前assert都是活动形式。
#include <assert.h>

int main ()
{
assert(signal(SIGABRT,&field_abort)!=SIG_ERR);
dummy();
++val;
fputs("Sample assertion failure message -- \n",stderr);
assert(val==0);
puts("FAILURE TESTING <assert.h>");
return(EXIT_FAILURE);
}

 

执行结果是:

Sample assertion failure message --
t: testAssert.c:41: main: Assertion `val==0' failed.
SUCCESS TESTING <assert.h>

 

例2:

#include <assert.h>  //没有define NDEBUG,故在声明以前assert都是活动形式。
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static int val=0;

static void field_abort(int sig)
{
if(val==1)
{
puts("SUCCESS TESTING <assert.h>");
exit(EXIT_SUCCESS);
}
else
{
puts("FAILURE TESTING <assert.h>");
exit(EXIT_FAILURE);
}
}

static void dummy()

{
int i=0;

assert(i==0);
assert(i==1);  //活动形式,故会终止
}

#define NDEBUG
#include <assert.h>

int main ()
{
assert(signal(SIGABRT,&field_abort)!=SIG_ERR);
dummy();
++val;
fputs("Sample assertion failure message -- \n",stderr);
assert(val==0);
puts("FAILURE TESTING <assert.h>");
return(EXIT_FAILURE);
}

 

执行结果是:

t: testAssert.c:28: dummy: Assertion `i==1' failed.
Aborted

转载于:https://www.cnblogs.com/Mr-Wenyan/p/7213809.html

相关文章:

  • 后台运行命令:amp;和nohup command amp; 以及关闭、查看后台任务
  • 进程间通信之-信号signal--linux内核剖析(九)
  • 入门之快速排序
  • 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
  • Vue框架 周期
  • 转 JavaScript 检查(Linting)工具的比较
  • 前端知识学习——html
  • oracle中length、lengthb、substr、substrb用法小结
  • SAS笔记(5) FLAG和计数器
  • 用于检测移动设备(包括平板电脑)的轻量级PHP类
  • 170511、Spring IOC和AOP 原理彻底搞懂
  • CodeChef Forest Gathering —— 二分
  • ReactiveSwift源码解析(九) SignalProducerProtocol延展中的Start、Lift系列方法的代码实现...
  • 在List中删除符合条件的内容
  • 亿级SQL Server运维的最佳实践PPT分享
  • [译]CSS 居中(Center)方法大合集
  • IOS评论框不贴底(ios12新bug)
  • JavaScript HTML DOM
  • JS笔记四:作用域、变量(函数)提升
  • js操作时间(持续更新)
  • js学习笔记
  • Median of Two Sorted Arrays
  • node和express搭建代理服务器(源码)
  • PHP 的 SAPI 是个什么东西
  • Shell编程
  • SQLServer之创建数据库快照
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 初识 beanstalkd
  • 搞机器学习要哪些技能
  • 构造函数(constructor)与原型链(prototype)关系
  • 前嗅ForeSpider教程:创建模板
  • 软件开发学习的5大技巧,你知道吗?
  • 数据可视化之 Sankey 桑基图的实现
  • 我的业余项目总结
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #宝哥教你#查看jquery绑定的事件函数
  • $.ajax()
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (二)fiber的基本认识
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)认识微服务
  • .apk文件,IIS不支持下载解决
  • .axf 转化 .bin文件 的方法
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core 中插件式开发实现
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .Net小白的大学四年,内含面经
  • // an array of int
  • [ IO.File ] FileSystemWatcher
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)