在嵌入式c中,往往采用串口打印函數來實現程序的調試,而在正式程序中一般是不需要這些打印代碼的,通常做法是在這些調試用打印代碼的前后設置一個宏定義塊來實現是否啟用這段代碼,比如:
// other user code ... #ifdef USE_DEBUG printf("the monitor count is %d", count); #endif // other user code ...
如果定義了USE_DEBUG,則打印起作用;否則上述代碼塊不會被編譯。
但上述代碼塊存在一個問題,當需要打印的地方很多時,都需要寫這么一段,程序代碼會顯得比較臃腫和繁瑣;如果能自己定義一個類printf打印函數,在函數內實現上述代碼塊,這樣代碼是比較簡便的,本文即實現該功能,自定義函數實現如下:
#ifdef USE_DEBUG #include <stdarg.h> // 調用頭文件 #define bufsize 120 char buffer[bufsize]; // 待打印字符串緩存 #endif // 自定義打印函數 void envprintf(const char * str, ...) { #ifdef USE_DEBUG va_list args; va_start(args, str); vsnprintf(buffer,bufsize,str,args); va_end(args); printf("%s\n", buffer); #endif }
上述代碼中的vsnprintf函數將多變參數轉換成字符串並保存至buffer中; 最后通過printf打印出來。
改進后程序中打印代碼如下:
// other user code ... envprintf("the monitor count is %d", count); // other user code ...
總結:本文只是通過可變參數功能實現打印的一個示例,在程序代碼中可以通過可變參數的系列功能宏定義與相關函數(比如vsnprintf、va_arg等)實現更多的應用。