欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

使用C语言中的宏来定位出错信息

发布时间:2025/3/19 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 使用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 
  • assert_test: assert_test.c:23: main: Assertion `input' failed. 
  • signal 'Aborted' catched. 
  • Abort 
  •  


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


    总结

    以上是生活随笔为你收集整理的使用C语言中的宏来定位出错信息的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。