C語言中可變引數的巨集定義

2021-06-25 22:08:53 字數 998 閱讀 3278

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

C語言可變引數巨集定義方法

在gnu c中,巨集可以接受可變數目的引數,就象函式一樣,例如 1 2 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 1 voidprintf...

C語言可變引數巨集

歲月不饒人,這年紀大了記憶力真是差了很多。今天寫程式需要用到可變引數的巨集,可是忘了怎麼寫,這倒也沒什麼,因為我一向是不記憶這些語法細節的,反正我知道程式裡有個地方用到了這種技巧,但是可悲的是我忘了在哪個地方。搜尋?語法都忘了蒐個p呀。只好憑著印象,在自己負責的模組 中找了一圈,花了十幾分鐘才終於在...

C語言中的可變數引數巨集和 說明

有時我們寫程式可能會定義許多debug模式下的除錯列印資訊巨集來替代原有的列印函式,這時就會出現編寫可變數引數巨集的寫法問題,下面就摘要性的寫一下,執行及除錯環境為rh linux 9.0 gcc 3.2.2 首先在gcc中,對可變數引數巨集的支援要強的多,一般我們可以這麼寫 define macr...