日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2025/3/19 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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语言中的宏来定位出错信息的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。