C語言(除錯絕活)
阿新 • • 發佈:2019-02-05
眾所周知,寫一段稍微複雜的程式碼,就會馬上面臨除錯的需要,而最基本的檢測程式執行情況的除錯技巧,就是在程式碼中安插許多 “警哨” 來幫助我們監視隨時可能發生的異常。
技術上這沒啥好說的,只是對於一個程式碼潔癖晚期患者來說,怎樣寫得乾淨又漂亮,是一件比寫程式碼本身更重要的事情。
先來一段反面教材看看:
像上述程式那樣的話,將不得已要對很多臨時除錯性程式碼做註釋,用的時候要去掉註釋符,非常麻煩。
更好的寫法是怎樣的呢?
注意到,我們使用條件編譯語句 #ifdef 來包含待除錯語句,這樣就能非常方便地開啟或者關閉除錯資訊,而且沒有註釋符巢狀的煩惱。
那麼,我們怎麼控制這些除錯語句的開啟和關閉呢? 除了在程式碼裡面定義巨集之外,更正統的做法是給編譯器相應的引數來控制:
開啟除錯功能:
gcc example.c -o example -DDEBUG
在這裡,-D就是編譯的同時,讓gcc幫我們自動定義(Define)一個臨時巨集,這個臨時巨集的名字就緊跟在這個選項 -D 的後面,比如 DEBUG。帶上了這個選項就相當於在程式碼裡面寫了這一行程式碼:
#define DEBUG
關閉除錯功能:
gcc example.c -o example
注意到,當我們關閉除錯功能的時候,雖然程式碼還在,但是編譯出來的執行程式已經去除了這部分程式碼,因此可以最大限度節約了程式的尺寸大小,同時我們也再不用在程式碼中頻繁修改來增刪註釋。這樣用起來是不是非常方便呢?