C++ assert.h头文件
NVIDIA面试笔试题之一:
assert.h是c标准库的一个头文件,该头文件的主要目的就是提供一个assert的宏定义。
assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。
该宏可以屏蔽掉,只需在包含assert.h之前#define NDEBUG,想开再#undef。从这里可以看出预处理带来的方便。
函数名: assert
功 能: 测试一个条件并可能使程序终止
用 法: void assert(int test);
#include <assert.h>#include <stdio.h>#include <stdlib.h>struct ITEM {int key;int value;};void additem(struct ITEM *itemptr) {assert(itemptr != NULL);}int main(void){additem(NULL);return 0;}
assert() 函数用法
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.c:
#include <stdio.h>#include <assert.h>#include <stdlib.h>int main( void ){FILE *fp;fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件assert( fp ); //所以这里不会出错fclose( fp );fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败assert( fp ); //所以这里出错fclose( fp ); //程序永远都执行不到这里来return 0;}
[root@localhost error_process]# gcc badptr.c[root@localhost error_process]# ./a.outa.out: badptr.c:14: main: Assertion `fp' failed.
已放弃
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100)
i++;
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤
注意:当对于浮点数:
#include<assert.h>
// float pi=3.14;
// assert(pi=3.14); //
float pi=3.14f;
assert (pi=3.14f);
---------------------------------------------------------
在switch语句中总是要有default子句来显示信息(Assert)。
int number = SomeMethod();
switch(number)
{
case 1:
Trace.WriteLine("Case 1:");
break;
case 2:
Trace.WriteLine("Case 2:");
break;
default :
Debug.Assert(false);
break;
}
C++ assert.h头文件相关推荐
- C++ .h(头文件) 与 .cpp(源文件) 的使用
.h 文件: .h是头文件 ,里面主要是写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等, 注意.h文件写的时候有特定的格式就是开头和结尾 #ifndef TEST_HEAD ...
- C语言不要重复包含.h头文件和.c文件
1.不要重复包含头文件 --以上出自<C语言程序设计:现代方法(第2版)> f3.h //#ifndef AE_OK #define AE_OK 0 typedef int ngx_int ...
- c语言怎么创建一个h文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 简答题] 实验任务:学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: (1)统计不 ...
- stdio.h头文件中申明的基本函数
stdio.h头文件中申明的基本函数 调用scanf函数时,需传入变量的地址作为参数,scanf函数会等待标准输入设备(键盘等)输入数据,并且将输入的数据赋值给地址对应的变量. #include< ...
- iOS架构-静态库.a编译时自动导出.h头文件(24)
在使用Xcode成功编译一个静态库时,在对应的输出目录下有一个include目录,但是其中没有相关的.h头文件.由于.h文件和 .cpp文件是在同一个目录下,再加上文件数量较多,如果手动的将.h文件导 ...
- .h头文件 .lib动态链接库文件 .dll 动态链接库
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
- c语言中count的头文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 简答题] 实验任务:学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: (1)统计不 ...
- .h头文件 .lib库文件 .dll动态链接库文件关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
- Qt警告提示:找不到“stddef.h”头文件,操蛋得很~~~
RT,Qt提示找不到"stddef.h"头文件,操蛋得很~~~ [root@fedora workspace]# find / -name stddef.h /usr/includ ...
最新文章
- 程序员如何判断是否到了该辞职的时候?以及常用的辞职借口总结
- java条码大小_java – 自定义条形码输入中缺少条形码高度
- java邻接图_Java数据结构 - 图(邻接表存储)
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1055:判断闰年
- 调查显示企业对 Linux 开发人才需求日渐增长
- P1332,nssl1316-血色先锋军【bfs】
- 【C++grammar】左值、右值和将亡值
- 这就是数据分析之数据采集
- CodeForces 722C Destroying Array
- 最大规模传统零售升级揭晓 100家大润发线上线下同步加入天猫618
- Xcode 运行程序,左侧memory 不显示内存
- Flutter 移动端屏幕适配方案和制作
- 怎么创建java项目?新建java项目的步骤
- 服务器电脑安装Centos7操作系统
- fiddler4在win7抓取https的配置整理
- 为你的YOLOv5任意版本添加Grad-CAM等热图可视化
- 【剑指 Offe】剑指 Offer 17. 打印从1到最大的n位数
- 【Linux系统开发】x210开发板根目录文件系统构建
- 江苏大学和南京工业大学计算机哪个好,江苏大学和浙江大学,哪个好?
- MacDroid for Mac v1.4 安卓手机文件传输助手
热门文章
- mysql 回档_数据库回档解决方案
- 怎样解决快照回档的问题
- 运筹学——对偶单纯形法
- spark的RDD中的action(执行)和transformation(转换)两种操作中常见函数介绍
- android studio拒绝访问,AndroidStudio错误:拒绝访问?
- 无处 不在的无线智能——6g 的关键驱动与研究挑战_全球首份6G白皮书出炉!
- 十年磨一剑,墨菲安全正式发布开源项目murphysec
- win10 电脑突然开不了热点解决办法
- mustache模板技术简介
- C++ static变量