在程式中為了除錯的方便經常會新增printf除錯列印,但在產品正式發布時會將除錯語句全部關掉,
這就涉及到如何關閉除錯語句,可使用巨集定義來達到除錯的目的,如:
#definedebug printf
以後程式中就可以用
debug("hello world\r\n");
要關閉除錯語句時可以定義巨集為:
#definedebug(fmt , ...)
即定義乙個空巨集即可,這樣除錯語句就會被編譯器自動優化掉;
但這樣做會有乙個問題,如:
if(i > 0)
debug("i > 0 \r\n");
i = 0;
上述程式片段的本意是在i大於0時列印,然後再使i等於0,即if語句只作用到debgu,
而不包含i = 0;這句話,但如果將除錯關掉後程式就變成了
if(i > 0)
i = 0;
即if語句作用到了i = 0;這句話中去了,顯然這違背了程式的本意;
因此我們就可以將if語句加上括號,不就可以啦,但你並不能要求所有**人員都這麼做,
況且if語句本身只包含一條語句時,是可以不用加括號的,因此別人不加括號也無可厚非,
那麼程式就只能從巨集定義本身入手了,這時我們可以用dowhile(0)語句來實現:即
#definedebug dowhile(0)
這樣程式就被展來為:
if(i > 0)
dowhile(0);
i = 0;
其中dowhile(0);並未做任何實質的事情,但那完全可以限制住if語句的作用域,這樣程式
就不會產生錯誤,同時dowhile(0);語句也會被優化掉。
同理我們也可將除錯巨集定義修改為:
#definedebug(fmt, ...)dowhile(0)
這樣除錯巨集定義就顯得比較完美了,其中debug(fmt, ...)中的fmt 為除錯格式字串,後面
的省略號表示其引數是可變的,而printf(fmt , ##__va_args__); 中的fmt 字串可以完
全替代過來,而後面的__va_args__表示引數的具體內容,這在編譯時會被編譯器確定下來,而前面
的##連詞符表示如果除錯語句不帶引數,就將將面的逗號去掉,以防語法出錯,這樣巨集定義
就算徹底完美了。
#definedebug_en1 // 0: close debug , 1: open debug
#ifdebug_en
#define
debug(fmt, ...)
dowhile(0)
#else
#define
debug
dowhile(0)
#endif
除錯技巧 巨集定義開關和printf
printf 的巨集定義版本 前言 我們在寫程式的時候,總是或多或少會加入一些printf之類的語句用於輸出除錯資訊,但是printf語句有個很不方便的地方就是當我們需要發布程式的時候要一條一條的把這些語句刪除,而一旦需要再次除錯的時候,這些語句又不得不一條條的加上,這給我們帶來了很大的不便,浪費了...
printf 巨集 除錯技巧
printf除錯是嵌入式除錯的基本手段,而且是非常重要的手段,我認為相比單步除錯更加有用有效,特別是微控制器之後跑系統,單步除錯效率更加低下了,我們在工作遇到bug的時候,我們第一時間就想知道那些該死的日誌有沒有儲存下來,這樣好讓我們程式設計師裝逼一波把問題解決。printf巨集定義除錯非常重要,有...
C51用巨集定義代替printf函式
有時候我們想用巨集定義來決定是編譯debug版本的 還是release的 dubug版本的 會通過printf列印除錯資訊,release版本的 則不會。我們總不能對每一條printf都這樣寫 if debug printf hello world endif這樣子實在是太麻煩了!萬一要各個地方都要...