定義可變引數的巨集

2021-10-07 19:42:07 字數 1606 閱讀 2933

像printf類的函式,如果**中的比較多,且需要檢查返回值時,沒用到乙個地方就新增一段返回值檢查會比較煩,不新增,如果要求pclint掃瞄時會報warning 514。

為了方便,有兩種方式,一種是封裝自己的函式,一種是定義成巨集。

封裝成自己的函式的壞處時,函式裡的輸出如果使用 __line__   __function__  等時,所有呼叫的地方都會是相同的。

所以,我這選擇定義成巨集。

先上**,vs2010驗證過:

#include "stdafx.h"

#include #define my_print(format , ...) printf(format, __va_args__)

#define my_sprintf_s(a,b,format,...) sprintf_s(a,b,format, __va_args__)

int _tmain(int argc, _tchar* ar**)

; my_sprintf_s(ctemp, 260, "%s %d\n", "hello test", 7);

my_print(ctemp);

my_print("hello world\n");

return 0;

}

執行結果:

解釋: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巨集是乙個空巨集,不做任何事情。

可變引數的巨集定義

link todo 原理 printf 和fprintf 這些輸出函式的引數是可變的,在除錯程式時,你可能希望定義自己的引數可變的輸出函式,那麼可變引數巨集會是乙個選擇。c99中規定巨集可以像函式一樣帶有可變引數,比如 define log format,fprintf stdout,format,...

可變引數的巨集定義

rintf 和fprintf 這些輸出函式的引數是可變的,在除錯程式時,你可能希望定義自己的引數可變的輸出函式,那麼可變引數巨集會是乙個選擇。c99中規定巨集可以像函式一樣帶有可變引數,比如 define log format,fprintf stdout,format,va args 其中,表示引...

可變引數巨集定義 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要求至少帶有乙個引...