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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用C语言中的宏来定位出错信息 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? 編寫一個(gè)軟件時(shí),軟件的健壯性時(shí)特別值得考慮的問題。使用C++時(shí)可以使用異常捕獲機(jī)制,在設(shè)計(jì)完軟件的模塊架構(gòu)的時(shí)候然后再設(shè)計(jì)異常捕獲架構(gòu),一般來說需要設(shè)計(jì)一個(gè)異常捕獲網(wǎng)來捕獲程序中可能的異常。

? ? 對(duì)于異常的處理,有些情況下沒有辦法實(shí)現(xiàn)程序的自恢復(fù),這時(shí)候只能無奈的輸出程序的出錯(cuò)的一些信息。在我看來,這些信息具體又分為靜態(tài)信息和動(dòng)態(tài)信息。靜態(tài)信息是編譯器期間確定的一些屬性,動(dòng)態(tài)期間是在運(yùn)行時(shí)期間才能確定的屬性。

? ? 例如,程序模塊a中的函數(shù)f的第l行出現(xiàn)錯(cuò)誤,在輸出錯(cuò)誤的時(shí)候我們要能夠輸出這些定位錯(cuò)誤的信息。利用C語言提供的內(nèi)置宏可以得到這些信息,常用的內(nèi)置宏為:__FILE__,__LINE__,__FUNCTION__,__TIME__,分別為文件名,行號(hào),函數(shù)名,以及該模塊對(duì)應(yīng)得源文件被預(yù)處理器處理的時(shí)間。這些信息都是編譯期間確定的,也就是我所說的靜態(tài)錯(cuò)誤信息。

? ? 下面是一個(gè)例子:

? ? 這個(gè)是頭文件: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;?
  • }?
  • ? ? 輸出結(jié)果如下:

  • Error?Occured?at:??
  • File:tmp_test.c??
  • Function:main??
  • Line:8??
  • Date:Feb?26?2012??
  • Time:17:04:27??
  • ?

    ? ?還有一種情況就是動(dòng)態(tài)信息,可以確定模塊在內(nèi)存中的位置,這就是常見的堆棧跟蹤信息。可以調(diào)用庫(kù)函數(shù)backtrace實(shí)現(xiàn)堆棧跟蹤,這個(gè)放在下一篇文章中。

    ? ?還有一個(gè)庫(kù)函數(shù)也是方便調(diào)試的,就是assert函數(shù),下面是一個(gè)assert函數(shù)的例子。assert函數(shù)根據(jù)參數(shù)情況來決定程序的運(yùn)行,如果參數(shù)判定為假或者0,將對(duì)進(jìn)程發(fā)出ABORT信號(hào),默認(rèn)的情況下,程序運(yùn)行結(jié)束。

    ? ?

  • /*?
  • *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;?
  • }?
  • ? ? 程序運(yùn)行結(jié)果如下:

    ? ??

  • 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?
  • ?


    本文轉(zhuǎn)自hipercomer 51CTO博客,原文鏈接:http://blog.51cto.com/hipercomer/790175


    總結(jié)

    以上是生活随笔為你收集整理的使用C语言中的宏来定位出错信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。