使用預處理器進行除錯

2021-06-23 06:47:13 字數 1944 閱讀 3111

c++ 程式設計師有時也會使用類似的技術有條件地執行用於除錯的**。這種想法是:程式所

包含的除錯**僅在開發過程中執行。當應用程式已經完成,並且準備提交時,

就會將除錯**關閉。可使用 ndebug 預處理變數實現有條件的除錯**:

int main()

{#ifndef ndebug

cerr << "starting main" << endl;

#endif

// ...

如果 ndebug 未定義,那麼程式就會將資訊寫到 cerr 中。如果 ndebug 已

經定義了,那麼程式執行時將會跳過 #ifndef 和 #endif 之間的**。

預設情況下,ndebug 未定義,這也就意味著必須執行 #ifndef 和 #endif

之間的**。在開發程式的過程中,只要保持 ndebug 未定義就會執行其中的調

試語句。開發完成後,要將程式交付給客戶時,可通過定義 ndebug 預處理變數,

(有效地)刪除這些除錯語句。大多數的編譯器都提供定義 ndebug 命令列選項:

$ cc -dndebug main.c

這樣的命令列行將於在 main.c 的開頭提供 #define ndebug 預處理命令。

預處理器還定義了其餘四種在除錯時非常有用的常量:

__file__ 檔名

__line__ 當前行號

__time__ 檔案被編譯的時間

__date__ 檔案被編譯的日期

可使用這些常量在錯誤訊息中提供更多的資訊:

if (word.size() < threshold)

cerr << "error: " << _ _file_ _

<< " : line " << _ _line_ _ << endl

<< " compiled on " << _ _date_ _

<< " at " << _ _time_ _ << endl

<< " word read was " << word

<< ": length too short" << endl;

如果給這個程式提供乙個比 threshold 短的 string 物件,則會產生下面

的錯誤資訊:

error: wdebug.cc : line 21

compiled on jan 12 2005 at 19:44:40

word read was "foo": length too short

另乙個常見的除錯技術是使用 ndebug 預處理變數以及 assert 預處理巨集。

assert 巨集是在 cassert 標頭檔案中定義的,所有使用 assert 的檔案都必須包含

這個標頭檔案。

預處理巨集有點像函式呼叫。assert 巨集需要乙個表示式作為它的條件:

assert(expr)

只要 ndebug 未定義,assert 巨集就求解條件表示式 expr,如果結果為

false,assert 輸出資訊並且終止程式的執行。如果該表示式有乙個非零(例如,

true)值,則 assert 不做任何操作。

與異常不同(異常用於處理程式執行時預期要發生的錯誤),程式設計師使用

assert 來測試「不可能發生」的條件。例如,對於處理輸入文字的程式,可以

**全部給出的單詞都比指定的閾值長。那麼程式可以包含這樣乙個語句:

assert(word.size() > threshold);

在測試過程中,assert 等效於檢驗資料是否總是具有預期的大小。一旦開

發和測試工作完成,程式就已經建立好,並且定義了 ndebug。在成品**中,

assert 語句不做任何工作,因此也沒有任何執行時代價。當然,也不會引起任

何執行時檢查。assert 僅用於檢查確實不可能的條件,這只對程式的除錯有幫

助,但不能用來代替執行時的邏輯檢查,也不能代替對程式可能產生的錯誤的檢

測。

使用CSS預處理器Less

前天寫了一篇文章,關於如何使用harp來加快人的開發效率,在mac系統和linux系統上測試是沒有問題的,但沒有在windows上測試,使用windows的剛入門的前端工程師,安裝harp失敗後,不知道怎麼解決問題。不管學習什麼,解決問題的能力是最重要的,學會自己動手。css有以下特點 然而css的...

預處理器小結

預處理器發生在程式被編譯之前,所有的預處理器指令都以 開頭。1.include預處理器指令 使指定檔案的乙個副本被包含到指令所在的位置。include 與 include filename 區別 簡單不加以說明 include 指令用於包含標準類庫標頭檔案,也可以用於由多個原始檔組成的程式。2.in...

預處理器簡介

預處理是c編譯器做的第一件事情,主要是做一些文字方面的工作。包括 刪除注釋 插入被 include包含的檔案 定義和替換由 define指令定義的符號以及 的部份內容,和條件編譯。預定義符號 預定義符號如下表所示 file 進行編譯的檔名 line 檔案的當前行號 date 檔案編譯的日期 time...