C 可變引數巨集
阿新 • • 發佈:2022-12-03
經常看到原始碼的巨集定義,一直不清楚 ## , _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");
巨集展開後,其中的字串後面會多個多餘的逗號,而“##”則會使前處理器去掉這個多餘的逗號。