可變引數的巨集定義

2021-09-10 07:33:36 字數 1242 閱讀 1298

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要求至少帶有乙個引...