使用C语言中的宏来定位出错信息
? ? 編寫一個(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
? ? ?下面是源文件:
? ? 輸出結(jié)果如下:
?
? ?還有一種情況就是動(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é)束。
? ?
? ? 程序運(yùn)行結(jié)果如下:
? ??
?
本文轉(zhuǎn)自hipercomer 51CTO博客,原文鏈接:http://blog.51cto.com/hipercomer/790175
總結(jié)
以上是生活随笔為你收集整理的使用C语言中的宏来定位出错信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Silverlight Toolki
- 下一篇: LintCode: Single Num