錯誤檢查 Thinking in C

2021-06-29 02:31:18 字數 1894 閱讀 3536

為本書其餘部分改進錯誤檢查是很方便的。用內聯函式可以簡單地包括乙個檔案而不用擔

心連線什麼。到目前為止, assert( )巨集已用於「錯誤檢查」,但它真正用處是除錯並終將被能夠

在執行時提供更多有用資訊的東西代替。何況異常處理程式(在 1 7章介紹)已提供了更多的處

理這些錯誤的有效的方法。

這是預處理器仍然有用的另乙個例子,因為 _ f i l e _和 _ l i n e _指示僅和預處理器一起起作

用並用在 assert( )巨集裡。假如 assert( )巨集在乙個錯誤函式裡被呼叫,它僅列印出錯函式的行號和

檔案名字而不是呼叫錯誤函式。這兒顯示了使用巨集聯接(許多是 assert( ) 方法)函式的方法,

緊接著呼叫 assert( )(程式除錯成功後這由乙個 #define ndebug消除)。

下面的標頭檔案將放在書的根目錄中,所以它可以從所有的章節裡得到。 「 a l l e g e」是 a s s e r t

//: allege.h -- error checking

#ifndef allege_h_

#define allege_h_

#include #include #include inline void

allege_error(int val, const char * msg)

}#define allege(expr, msg) \

#define allegemem(expr) \

allege(expr, "out of memory")

#define allegefile(expr) \

allege(expr, "could not open file")

#endif // allege_h_

函式allege_error( )有兩個引數:乙個是整型表示式的值,另乙個是這個值為 f a l s e時需列印

的訊息。函式 fprintf( )代替 i o s t r e a m s是因為在只有少量錯誤的情況下,它工作得更好。假如這

不是為除錯建立的, e x i t ( 1 )被呼叫以終止程式。

allege( )巨集使用三重 i f - t h e n - e l s e強迫計算表示式 e x p r求值。在巨集裡呼叫了 allege_error( ),接

著是 assert( ) ,所以我們能在除錯時獲得 assert( )的好處——因為有些環境緊密地把偵錯程式和

assert( )結合在一起。

allegefile( )巨集和 allegemen( )巨集分別是 allege( )巨集用於檢查檔案和記憶體的專用版本。這個代

碼提供了出錯報告的必要的最少資訊,但我們可以在這個框架基礎上增加它。

下面是測試a l l e g e . h簡單例子。

//: errtest.cpp -- testing the allege() macro

// #define ndebug // turn off asserts

#include "../allege.h"

#include main()

去掉下面這行的注釋符後,我們就知道這個程式是如何變為成品的:

//#define ndebug // turn off asserts

對於本書其餘部分,將一律用 allege( )巨集代替 assert( ),只有個別只須在除錯時檢查而執行

時不需的情況才用 assert( )。

bash指令碼錯誤檢查

在bash shell 指令碼中總是需要對已經執行命令作錯誤檢查,以便進行下一步處理.bin bash error e 31 47m error eend e 0m n function die eend will uncomment below without test exit 1 like p...

thinking in C 讀書日誌(二)

2007 08 01 第二章物件的建立與使用 第二章主要講述 c 的一些基礎知識和基本語法,不過我們仍能從書中學到新的東西。這次盡量減小文章的篇幅。主要分兩方面寫 1.推薦知識點,從廣度上覆蓋本章精華 2.對特定某個知識點的進一步研究 從深度上進行探索。1 直譯器與翻譯器 p28 初始學 c 的時候...

thinking in C 讀書日誌(六)

第六章 初始化與清除 這一章說實話沒什麼東西。我用了一小時看完了。不過關於析構函式我一直有乙個疑問,有興趣的同學到我部落格討論一下吧。我們都知道,在c 裡當宣告乙個類時,如果你不寫建構函式,系統就會自動生成乙個預設建構函式。由於此建構函式往往不盡人意,我們一般會重寫建構函式。且當我們定義了自己的建構...