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...