link:
todo: 原理
printf()和fprintf()這些輸出函式的引數是可變的,在除錯程式時,你可能希望定義自己的引數可變的輸出函式,
那麼可變引數巨集會是乙個選擇。
c99中規定巨集可以像函式一樣帶有可變引數,比如
#define log(format, ...) fprintf(stdout, format, __va_args__)
其中,...表示引數可變,__va_args__在預處理中為實際的引數集所替換
gcc中同時支援如下的形式
#define log(format, args...) fprintf(stdout, format, args)
其用法和上面的基本一致,只是引數符號有變化
有一點需要注意,上述的巨集定義不能省略可變引數,儘管你可以傳遞乙個空引數,這裡有必要提到"##"連線符號的用法。
"##"的作用是對token進行連線,在上例中,format、__va_args__、args即是token,
如果token為空,那麼不進行連線,所以允許省略可變引數(__va_args__和args),對上述變參巨集做如下修改
#define log(format, ...) fprintf(stdout, format, ##__va_args__)
#define log(format, args...) fprintf(stdout, format, ##args)
上述的變參巨集定義不僅能自定義輸出格式,而且配合#ifdef #else #endif在輸出管理上也很方便,
比如除錯時輸出除錯資訊,正式發布時則不輸出,可以這樣
#ifdef debug
#define log(format, ...) fprintf(stdout, ">> "format"\n", ##__va_args__)
#else
#define log(format, ...)
#endif
在除錯環境下,log巨集是乙個變參輸出巨集,以自定義的格式輸出;
在發布環境下,log巨集是乙個空巨集,不做任何事情。
from
可變引數的巨集定義
rintf 和fprintf 這些輸出函式的引數是可變的,在除錯程式時,你可能希望定義自己的引數可變的輸出函式,那麼可變引數巨集會是乙個選擇。c99中規定巨集可以像函式一樣帶有可變引數,比如 define log format,fprintf stdout,format,va args 其中,表示引...
定義可變引數的巨集
像printf類的函式,如果 中的比較多,且需要檢查返回值時,沒用到乙個地方就新增一段返回值檢查會比較煩,不新增,如果要求pclint掃瞄時會報warning 514。為了方便,有兩種方式,一種是封裝自己的函式,一種是定義成巨集。封裝成自己的函式的壞處時,函式裡的輸出如果使用 line functi...
可變引數巨集定義 VA ARGS
1 使用va args define log printf va args define log err format,printf err format n va args define log err format,printf err format n va args 標準c要求至少帶有乙個引...