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要求至少帶有乙個引數,gcc可以不帶引數
使用##時可變引數可以為空,不會引起編譯錯誤
__va_args__在標準c中當變參為空時可能出現編譯錯誤
"##"的作用是對token進行連線,如果token為空,那麼不進行連線,所以允許省略可變引數(__va_args__和args),而不出現編譯錯誤
2)args…
#define log(args…) printf (args)
args…是gcc遺留的寫法,不建議使用。 可變引數巨集 VA ARGS
可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...
可變引數巨集 VA ARGS
可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 ...
可變引數巨集 VA ARGS
可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...