编写一个软件时,软件的健壮性时特别值得考虑的问题。使用C++时可以使用异常捕获机制,在设计完软件的模块架构的时候然后再设计异常捕获架构,一般来说需要设计一个异常捕获网来捕获程序中可能的异常。

对于异常的处理,有些情况下没有办法实现程序的自恢复,这时候只能无奈的输出程序的出错的一些信息。在我看来,这些信息具体又分为静态信息和动态信息。静态信息是编译器期间确定的一些属性,动态期间是在运行时期间才能确定的属性。

例如,程序模块a中的函数f的第l行出现错误,在输出错误的时候我们要能够输出这些定位错误的信息。利用C语言提供的内置宏可以得到这些信息,常用的内置宏为:__FILE__,__LINE__,__FUNCTION__,__TIME__,分别为文件名,行号,函数名,以及该模块对应得源文件被预处理器处理的时间。这些信息都是编译期间确定的,也就是我所说的静态错误信息。

下面是一个例子:

这个是头文件:tmp_header.h

  1. /*
  2. *Author:Chaos Lee
  3. *Date:2012-02-26 16:52
  4. */
  5. #ifndef TMP_HEADER_H
  6. #define TMP_HEADER_H
  7. #include<stdio.h>
  8. #define MSGDEBUG fprintf(stderr,"Error Occured at:\nFile:%s\nFunction:%s\nLine:%d\nDate:%s\nTime:%s\n",__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIME__);
  9. #endif

下面是源文件:

  1. /*
  2. *Author:Chaos Lee
  3. *Date:2012-02-26 16:55
  4. */
  5. #include"tmp_header.h"
  6. int main()
  7. {
  8. MSGDEBUG;
  9. return 0;
  10. }

输出结果如下:

  1. Error Occured at:
  2. File:tmp_test.c
  3. Function:main
  4. Line:8
  5. Date:Feb 26 2012
  6. Time:17:04:27

还有一种情况就是动态信息,可以确定模块在内存中的位置,这就是常见的堆栈跟踪信息。可以调用库函数backtrace实现堆栈跟踪,这个放在下一篇文章中。

还有一个库函数也是方便调试的,就是assert函数,下面是一个assert函数的例子。assert函数根据参数情况来决定程序的运行,如果参数判定为假或者0,将对进程发出ABORT信号,默认的情况下,程序运行结束。

  1. /*
  2. *Author:Chaos Lee
  3. *Date:2012-02-26 10:37
  4. */
  5. #include<stdio.h>
  6. #include<assert.h>  //for assert
  7. #include<signal.h>  //for signal
  8. void sig_abrt(int signo)
  9. {
  10. printf("signal 'Aborted' catched.\n");
  11. }
  12. void installSignalHandler()
  13. {
  14. signal(SIGABRT,sig_abrt);
  15. }
  16. int main()
  17. {
  18. int input=1;
  19. installSignalHandler();
  20. while(input)
  21. {
  22. scanf("%d",&input);
  23. assert(input);
  24. printf("you have entered:%d\n",input);
  25. }
  26. return 0;
  27. }

程序运行结果如下:

  1. 32
  2. you have entered:32
  3. 54
  4. you have entered:54
  5. 0
  6. assert_test: assert_test.c:23: main: Assertion `input' failed.
  7. signal 'Aborted' catched.
  8. Abort

本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/790175

使用C语言中的宏来定位出错信息相关推荐

  1. C语言使用define定义圆周率,C语言中的宏处理

    在C语言中使用宏,我们经常这么做,但是为什么使用宏,他可以做什么,我们或许只是一知半解,下面简单介绍如何在C语言中使用宏预处理器. #define语句 对于define语句,我们已经非常熟悉,一个宏定 ...

  2. c语言中关于宏和内联说法正确的是, 2011年1月高等教育自学考试全国统一命题考试 C++程序设计试题...

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  3. 关于C语言中的宏的一点点讨论

    前言: 熟悉C语言的朋友应该对宏不陌生, 宏在C语言程序开发中是经常使用的,使用其的主要目的是方便程序员的编程工作,并且能在一定程度上提高程序的效率.C语言中提供的宏定义命令是#define.下面就使 ...

  4. C语言怎么判断字符YN,c语言中的宏_详解(转)

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...

  5. C语言中的宏函数与宏定义

    目录 1.无参宏定义 1.1 无参数宏定义的格式: 1.2 使用说明: 2.带参宏定义 2.1 带参数宏定义的格式: 2.2 使用说明: 3.带参宏定义与函数调用的区别 4.头文件中常用的宏定义 5. ...

  6. C语言中关于宏定义的学习

    1.C语言中宏定义的使用 2.GCC官方文档 3.C语言宏定义的几个坑和特殊用法 转载于:https://www.cnblogs.com/Brandon0807/p/11146344.html

  7. C语言中利用宏,实现一个整数的奇数位和偶数位交换,以及计算结构体中某变量相对于首地址的偏移

    C语言中的自定义宏 自定义宏,令其实现所需功能 1.写一个宏,可以将一个整数字的奇数位和偶数位交换. 2.写一个宏,计算结构体中某变量相对于首地址的偏移. 具体思路1: 首先取出当前数的奇数部分和偶数 ...

  8. go语言中无法获取goroutine相关的信息

    2019独角兽企业重金招聘Python工程师标准>>> java中可以通过Thread.getId()或者Thread.getName()来获得当前的Thread标识信息,但是gol ...

  9. 一招让你彻底掌握C语言中运用宏以及#与##的妙用

    学习C语言,特别是阅读linux源码的时候,大家经常遇到很多的宏定义,有简单的,当然也有很复杂的. 有事一个宏定义甚至有几十行之多,遇到这种宏定义的大家基本上是一脸懵逼,不知所措,其实想复杂的宏定义没 ...

最新文章

  1. 设计师你们还坐的住吗?2021 PS 进入人工智能 P 图时代
  2. MySQL这样写UPDATE语句,劝退
  3. zabbix server、zabbix agent、zabbix proxy 配置文件详解
  4. ×××论坛应该为访问者更大的价值
  5. java 蓝桥杯算法训练 奇变的字符串(题解)
  6. eclipse 矩阵删除行列,也可以矩阵形式编辑
  7. 女人让男人感到自卑的九个经典(摘于网络)
  8. 如何从SQL Server中的SELECT更新?
  9. [Flink]Flink DataStream window join 和interval join
  10. VirtualBox6.0安装及配置
  11. 华为手机助手 for Mac(华为手机管理软件)中文版
  12. python实现局域网内传输文件
  13. 路由器不开机——维修更换MT7621AT CPU
  14. C语言怎么用char输出多个字母,c语言中char类型如何存放多个字符
  15. 树莓派外接显示器黑屏_HDMI-VGA转换器黑屏的排障方案
  16. php使用获取mysqlerror时报错Call to undefined function mysql_error()
  17. 我的世界服务器无限刷雪傀儡,《我的世界》四个刷怪技巧,雪傀儡的雪球用来对付烈焰人有奇效?...
  18. cmos逻辑门传输延迟时间_如何判断输出的高低电平(三态门)?
  19. UltraEdit (UEStudio)使用技巧
  20. echarts旭日图

热门文章

  1. python分配buffer_Node.js中的buffer如何和python中的buffer相对应
  2. python读取 application_python PyQt5.QtWidgets.QApplication类(sys.argv)(app应用对象类)...
  3. vim如何在底部打开新窗口
  4. python实现k core算法_Python core.take方法代码示例
  5. rssi室内定位算法原理_三分钟看懂蓝牙室内定位 值得分享
  6. dj打碟怎么学_南京学DJ打碟
  7. php lararel,laravel整合tinymce和ckeditor编辑器,并用elfinder上传图片
  8. 【项目管理】认识项目相关方(干系人)管理
  9. 笔记-项目整体管理-开工会议-kick-off-meeting
  10. Leaflet中使用leaflet.easyPrint插件实现打印效果