linux系统下如何使用assert函数

只要看得懂程序的人都知道assert,在Windows下使用VC编写,使用assert之后,只需在IDE中设置为debug版或者是release版,编译器就会自动忽略掉assert。但是在Linux下,必须要在编译命令中加入-DNDEBUG中,系统编译时才不会将assert编译进去。不然,程序运行时有可能会被assert中断。那linux系统下如何使用assert函数呢?下面就和大家说一下linux系统下使用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.out

a.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不能代替条件过滤

上述也就是linux系统下使用assert函数方法的全部内容了。如你还不知道在linux系统下如何使用assert函数的,不妨请你先看看上述的内容啊!看完了你也就知道怎么使用assert函数了。有兴趣的用户可以去来了解一下。

Linux中assert头文件,linux系统下如何使用assert函数相关推荐

  1. 如何向linux中添加头文件,linux添加头文件路径

    gcc demo.c -o demo  -I/tools/libevent/include -L/tools/libevent/lib -levent -I:头文件目录 -L:静态库目录 -l:静态库 ...

  2. Linux中常用头文件的作用--转

    http://blog.sina.com.cn/s/blog_5c93b2ab0100q62k.html 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言 ...

  3. Linux C try 头文件,linux c 头文件

    //1.Linux中一些头文件的作用: #include //ANSI C.提供断言,assert(表达式) #include //GCC.GTK,GNOME的基础库,提供很多有用的函数,如有数据结构 ...

  4. linux非标准头文件,Linux学习:unix的标准化的实现(Linux中各种限制-数据类型-各种标准化头文件介绍)...

    作为Linux的前身,unix标准化是十分重要的.我在这里挑几个重要的点说明. 1:Linux中各种限制.Linux中限制有编译时限制和运行时限制,另外有一些限制是由于我们的实现不同而不同,因此我们需 ...

  5. linux中什么是文件,linux中什么是文件

    linux中什么是文件 1.Linux中所有内容都是以文件的形式保存和管理,即:一切皆文件. 普通文件是文件. 目录(在win下称为文件夹)是文件. 硬件设备(键盘.硬盘.打印机)是文件. 套接字(s ...

  6. 搜索linux中大于m文件,linux 下查找大于100M的文件(转)

    命令行如下 find . -type f -size +1000000k Linux系统下查找大文件或目录的技巧 当硬盘空间不够时,我们就很关心哪些目录或文件比较大,看看能否干掉一些了,怎么才能知道呢 ...

  7. linux中运行.pro文件,Linux下pro*c运行配置

    在Linux下运行.pc程序时,需要用到proc命令. -配置Pro*C/C++,以及链接到Oracle. 一般安装oracle时候都已经安装了pro*c,所以一般不需要再配置/etc/profile ...

  8. linux中安装多个mysql_liunx系统下安装多个MySql数据库并做主从配置

    在网上搜索了很多资料,都没有看到像样的文档,思路不是很清晰,对第一次安装的朋友来说较为困难,经过长时间的安装尝试和查询网上零碎的知识点,终于成功的完成Linux系统下多MySql数据库安装和主从配置, ...

  9. linux c memset 头文件,linux下的memset函数

    起因]希望对各种类型的数组进行初始化,避免野值 memset函数将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化 ...

最新文章

  1. typeorm 修改事务_nest.js + typeORM: 身份认证, 事务管理
  2. java ee期末项目相关
  3. plsql(轻量版)-存储函数存储过程
  4. ORACLE查看某个表的索引状态
  5. sql server 快照_在SQL Server合并复制中应用快照时出现外键问题
  6. php栏目树,php生成无限栏目树
  7. diamond专题(一)– 简介和快速使用
  8. java jenkins_java调用jenkins-client实现连接jenkins服务 互联网技术圈 互联网技术圈
  9. Axure 基础控件(1-49)
  10. JavaScript实现哈希表数据结构
  11. php网页设计课程设计dreamweaver8_Dreamweaver 8.0 多媒体网页制作教程
  12. 网易2020校招数据分析方向正式批笔试题 解析
  13. android9.0+wifi叹号,手机wifi连上有个感叹号怎么解决_wifi已连接但有感叹号的处理方法-系统城...
  14. Oracle存储过程打印输出错误信息、行号,快速排查
  15. 硬盘开盘证明怎么写,开盘证明范本
  16. 苹果终止位置共享无法连接服务器,苹果发布临时解决方案指导用户处理macOS无法共享访问Windows的问题...
  17. 淘宝商品采集上架拼多多店铺(无货源数据采集接口,拼多多商品详情数据,淘宝商品详情数据,京东商品详情数据)接口代码对接教程
  18. 怎样合理有效的与人争论(讨论)问题?
  19. echarts3.7.1 用例体验地图
  20. java compare 和equals,java-在此示例中compareTo和equals方法如何工作?

热门文章

  1. python 寻找数组的中心索引_Leetcode724:寻找数组的中心索引(java、python3)
  2. cygwin用命令安装软件_软件安装、命令行、Github
  3. 计算机会计学ufo报表,计算机会计实践部分工资管理系统.ppt
  4. 计算机考研逻辑学,管综专硕:走出不考逻辑学专业知识的误区
  5. java mina多线程_mina2中的线程池
  6. language mysql_MySql 语言的分类;
  7. 4 个使用率非常高的 Linux 监控工具
  8. 皮一皮:经历过的举手报道...
  9. 微信8.0之后,又悄悄上线新功能:别人“抢不到”的红包!赶紧看看灰度到你了没?...
  10. 皮一皮:低调的凡尔赛...