有時候我們想用巨集定義來決定是編譯debug版本的**還是release的**,dubug版本的**會通過printf列印除錯資訊,release版本的**則不會。我們總不能對每一條printf都這樣寫:
#if _debug_
printf("hello world!");
#endif
這樣子實在是太麻煩了!萬一要各個地方都要列印,會使版面看起來很亂。
我後來想到乙個方法,編譯器為gcc,可以使用巨集定義代替printf函式,由於printf是可變引數的函式,這裡就要用到變參巨集(…和__va_args__)。
在標頭檔案下寫此**
#define _debug_ 1
#if _debug_
#define pr(...) printf(__va_args__)
#else
#define pr(...)
#endif
後面需要列印除錯資訊的時候使用pr巨集就可以了,如果需要release版本,不列印除錯資訊,就把debug設定為0,編譯出來的程式就不會列印除錯資訊了。
keil c51中的問題
gcc編譯器與c51是兩個不同的編譯器,所以c語言編譯的標準也是不同的。
如果c51使用gcc編譯標準巨集定義代替printf函式,你的**將會報錯,c51的快取記憶體是有限的,巨集定義是 不允許有定義不定引數函式的。我想了好久,它不給巨集定義不定引數函式,但卻可以使用printf不定引數函式,我可不可以跳過不定引數函式呢?
#define _debug_ 1
#if _debug_
#define debug_printf printf
#else
#define debug_printf /##/
#endif
我巧妙的利用define 代替的特性,如果_debug_等於1時,debug_printf 等於printf ,列印正常輸出 ,但_debug_等於0時,列印將關閉,debug_printf 將等於 // ,編譯時後面列印的將被注釋掉。
經常在實際的除錯過程中,使用最基本的除錯方法printf,但是常常需要在print函式中使用引數__filename__、__function__、__line__,特別是大型的專案中,感覺在編碼時重複寫入這幾個引數有些繁瑣,所以很自然的想到了巨集定義,當然你也可以參照printf函式寫自己的my_printf函式,但是不想費周折就使用巨集定義吧!**如下:
環境 標準c99,gnc
#define prt(...) printf("filename %s, function %s, line %d > ", __file__, __function__, __line__); \
printf(__va_args__); \
printf("\n");
測試**:
#include #include #define prt(...) printf("filename %s, function %s, line %d > ", __file__, __function__, __line__); \
printf(__va_args__); \
printf("\n");
int main()
測試結果:
root@ubuntu:/home/ybq/desktop# gcc printf.c -o printf
root@ubuntu:/home/ybq/desktop# ./printf
filename printf.c, function main, line 22 > a
filename printf.c, function main, line 23 > hello, 10
filename printf.c, function main, line 24 > 10, dafdsa, 20
#define dvr_prt(format,...) printf("[file:"__file__", line:%d] "format, __line__, ##__va_args__)
#define prt(format,...) printf("[file:%s, line:%d] "format, __file__, __line__, ##__va_args__)
該技巧可以用在微控制器c語言開發上,切換版本非常方便。
keil環境下如何重定向printf到串列埠,可以參考這裡。
C51中預定義巨集
cx51編譯器提供了下列預定義的常量,它使你可以用預處理器指令和c 來建立可移植程式。常量 說明 型別 c51 c51編譯器的版本號 例如,810代表版本8.10 數值 cx51 cx51編譯器的版本號 例如,810代表版本8.10 目前該預定義巨集已經被取消。數值 date 當編譯開始時的ansi...
c51為啥要巨集定義時鐘 c51時鐘
程式效果 時鐘,包括時間可調,定時到了鬧鐘響,用蜂鳴器,本程式已經除錯通過 喇叭接在p2.0上.埠均可自行更改.include 標頭檔案 include define uchar unsigned char 巨集定義 define uint unsigned int sbit key1 p3 5 位...
用c51譜寫化蝶
演奏原理 2 樂譜單位元組編碼方法 1 定時器0 1產生各種音訊的方法 表1 為c調的發音頻率表,給出了各個音的頻率f,可以用定時器 計數器,定時產生對應頻率的方波訊號,將方波訊號送給喇叭,便可使喇叭發出同頻率的聲音。定時初值x與發聲頻率f的關係如下 由公式 t 2n x tmc 式中 t t 2 ...