使用C语言中的宏来定位出错信息
编写一个软件时,软件的健壮性时特别值得考虑的问题。使用C++时可以使用异常捕获机制,在设计完软件的模块架构的时候然后再设计异常捕获架构,一般来说需要设计一个异常捕获网来捕获程序中可能的异常。
对于异常的处理,有些情况下没有办法实现程序的自恢复,这时候只能无奈的输出程序的出错的一些信息。在我看来,这些信息具体又分为静态信息和动态信息。静态信息是编译器期间确定的一些属性,动态期间是在运行时期间才能确定的属性。
例如,程序模块a中的函数f的第l行出现错误,在输出错误的时候我们要能够输出这些定位错误的信息。利用C语言提供的内置宏可以得到这些信息,常用的内置宏为:__FILE__,__LINE__,__FUNCTION__,__TIME__,分别为文件名,行号,函数名,以及该模块对应得源文件被预处理器处理的时间。这些信息都是编译期间确定的,也就是我所说的静态错误信息。
下面是一个例子:
这个是头文件:tmp_header.h
- /*
- *Author:Chaos Lee
- *Date:2012-02-26 16:52
- */
- #ifndef TMP_HEADER_H
- #define TMP_HEADER_H
- #include<stdio.h>
- #define MSGDEBUG fprintf(stderr,"Error Occured at:\nFile:%s\nFunction:%s\nLine:%d\nDate:%s\nTime:%s\n",__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIME__);
- #endif
下面是源文件:
- /*
- *Author:Chaos Lee
- *Date:2012-02-26 16:55
- */
- #include"tmp_header.h"
- int main()
- {
- MSGDEBUG;
- return 0;
- }
输出结果如下:
- Error Occured at:
- File:tmp_test.c
- Function:main
- Line:8
- Date:Feb 26 2012
- Time:17:04:27
还有一种情况就是动态信息,可以确定模块在内存中的位置,这就是常见的堆栈跟踪信息。可以调用库函数backtrace实现堆栈跟踪,这个放在下一篇文章中。
还有一个库函数也是方便调试的,就是assert函数,下面是一个assert函数的例子。assert函数根据参数情况来决定程序的运行,如果参数判定为假或者0,将对进程发出ABORT信号,默认的情况下,程序运行结束。
- /*
- *Author:Chaos Lee
- *Date:2012-02-26 10:37
- */
- #include<stdio.h>
- #include<assert.h> //for assert
- #include<signal.h> //for signal
- void sig_abrt(int signo)
- {
- printf("signal 'Aborted' catched.\n");
- }
- void installSignalHandler()
- {
- signal(SIGABRT,sig_abrt);
- }
- int main()
- {
- int input=1;
- installSignalHandler();
- while(input)
- {
- scanf("%d",&input);
- assert(input);
- printf("you have entered:%d\n",input);
- }
- return 0;
- }
程序运行结果如下:
- 32
- you have entered:32
- 54
- you have entered:54
- 0
- assert_test: assert_test.c:23: main: Assertion `input' failed.
- signal 'Aborted' catched.
- Abort
本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/790175
使用C语言中的宏来定位出错信息相关推荐
- C语言使用define定义圆周率,C语言中的宏处理
在C语言中使用宏,我们经常这么做,但是为什么使用宏,他可以做什么,我们或许只是一知半解,下面简单介绍如何在C语言中使用宏预处理器. #define语句 对于define语句,我们已经非常熟悉,一个宏定 ...
- c语言中关于宏和内联说法正确的是, 2011年1月高等教育自学考试全国统一命题考试 C++程序设计试题...
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...
- 关于C语言中的宏的一点点讨论
前言: 熟悉C语言的朋友应该对宏不陌生, 宏在C语言程序开发中是经常使用的,使用其的主要目的是方便程序员的编程工作,并且能在一定程度上提高程序的效率.C语言中提供的宏定义命令是#define.下面就使 ...
- C语言怎么判断字符YN,c语言中的宏_详解(转)
1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...
- C语言中的宏函数与宏定义
目录 1.无参宏定义 1.1 无参数宏定义的格式: 1.2 使用说明: 2.带参宏定义 2.1 带参数宏定义的格式: 2.2 使用说明: 3.带参宏定义与函数调用的区别 4.头文件中常用的宏定义 5. ...
- C语言中关于宏定义的学习
1.C语言中宏定义的使用 2.GCC官方文档 3.C语言宏定义的几个坑和特殊用法 转载于:https://www.cnblogs.com/Brandon0807/p/11146344.html
- C语言中利用宏,实现一个整数的奇数位和偶数位交换,以及计算结构体中某变量相对于首地址的偏移
C语言中的自定义宏 自定义宏,令其实现所需功能 1.写一个宏,可以将一个整数字的奇数位和偶数位交换. 2.写一个宏,计算结构体中某变量相对于首地址的偏移. 具体思路1: 首先取出当前数的奇数部分和偶数 ...
- go语言中无法获取goroutine相关的信息
2019独角兽企业重金招聘Python工程师标准>>> java中可以通过Thread.getId()或者Thread.getName()来获得当前的Thread标识信息,但是gol ...
- 一招让你彻底掌握C语言中运用宏以及#与##的妙用
学习C语言,特别是阅读linux源码的时候,大家经常遇到很多的宏定义,有简单的,当然也有很复杂的. 有事一个宏定义甚至有几十行之多,遇到这种宏定义的大家基本上是一脸懵逼,不知所措,其实想复杂的宏定义没 ...
最新文章
- 设计师你们还坐的住吗?2021 PS 进入人工智能 P 图时代
- MySQL这样写UPDATE语句,劝退
- zabbix server、zabbix agent、zabbix proxy 配置文件详解
- ×××论坛应该为访问者更大的价值
- java 蓝桥杯算法训练 奇变的字符串(题解)
- eclipse 矩阵删除行列,也可以矩阵形式编辑
- 女人让男人感到自卑的九个经典(摘于网络)
- 如何从SQL Server中的SELECT更新?
- [Flink]Flink DataStream window join 和interval join
- VirtualBox6.0安装及配置
- 华为手机助手 for Mac(华为手机管理软件)中文版
- python实现局域网内传输文件
- 路由器不开机——维修更换MT7621AT CPU
- C语言怎么用char输出多个字母,c语言中char类型如何存放多个字符
- 树莓派外接显示器黑屏_HDMI-VGA转换器黑屏的排障方案
- php使用获取mysqlerror时报错Call to undefined function mysql_error()
- 我的世界服务器无限刷雪傀儡,《我的世界》四个刷怪技巧,雪傀儡的雪球用来对付烈焰人有奇效?...
- cmos逻辑门传输延迟时间_如何判断输出的高低电平(三态门)?
- UltraEdit (UEStudio)使用技巧
- echarts旭日图
热门文章
- python分配buffer_Node.js中的buffer如何和python中的buffer相对应
- python读取 application_python PyQt5.QtWidgets.QApplication类(sys.argv)(app应用对象类)...
- vim如何在底部打开新窗口
- python实现k core算法_Python core.take方法代码示例
- rssi室内定位算法原理_三分钟看懂蓝牙室内定位 值得分享
- dj打碟怎么学_南京学DJ打碟
- php lararel,laravel整合tinymce和ckeditor编辑器,并用elfinder上传图片
- 【项目管理】认识项目相关方(干系人)管理
- 笔记-项目整体管理-开工会议-kick-off-meeting
- Leaflet中使用leaflet.easyPrint插件实现打印效果