生活随笔
收集整理的这篇文章主要介绍了
使用C语言中的宏来定位出错信息
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
编写一个软件时,软件的健壮性时特别值得考虑的问题。使用C++时可以使用异常捕获机制,在设计完软件的模块架构的时候然后再设计异常捕获架构,一般来说需要设计一个异常捕获网来捕获程序中可能的异常。
对于异常的处理,有些情况下没有办法实现程序的自恢复,这时候只能无奈的输出程序的出错的一些信息。在我看来,这些信息具体又分为静态信息和动态信息。静态信息是编译器期间确定的一些属性,动态期间是在运行时期间才能确定的属性。
例如,程序模块a中的函数f的第l行出现错误,在输出错误的时候我们要能够输出这些定位错误的信息。利用C语言提供的内置宏可以得到这些信息,常用的内置宏为:__FILE__,__LINE__,__FUNCTION__,__TIME__,分别为文件名,行号,函数名,以及该模块对应得源文件被预处理器处理的时间。这些信息都是编译期间确定的,也就是我所说的静态错误信息。
下面是一个例子:
这个是头文件:tmp_header.h
#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 下面是源文件:
#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信号,默认的情况下,程序运行结束。
#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语言中的宏来定位出错信息的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。