1. 程式人生 > 其它 >C 可變引數巨集

C 可變引數巨集

經常看到原始碼的巨集定義,一直不清楚 ## , _VA_ARGS , ... , args... 的作用是什麼,記錄下。

1999 年的 ISO C 標準裡規定了可變引數巨集,語法和函式類似,比如:
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
其中的“...”表示可變引數,實際呼叫時,它們會替代巨集體裡的__VA_ARGS__。GCC 支援更復雜的形式,可以給可變引數取個名字,如下所示。

#define debug(format, args...) fprintf (stderr, format, args)

有了名字之後,程式碼顯得更具有可讀性。核心中的例子為:

++++ include/linux/kernel.h

244  #define pr_info(fmt,arg...) \
245  printk(KERN_INFO fmt,##arg)

其中的 pr_info 和上面的 debug 形式除了“##”外,幾近相同。

“##”主要針對引數為空的情況。既然稱為可變引數,那傳遞空引數也是可以的。如果沒有使用“##”,傳遞空引數時,比如:
debug ("A message");
巨集展開後,其中的字串後面會多個多餘的逗號,而“##”則會使前處理器去掉這個多餘的逗號。