標準 C 只支持可變參數的函數,意味着函數的參數是不固定的,例如 printf()函數的原型爲:
int printf( const char *format [, argument]... );
而在 GNU C 中,宏也能夠接受可變數目的參數,例如:
#define pr _ debug(fmt,arg...) \
printk(fmt,##arg)
這裏 arg 表示其他的參數能夠是零個或多個,這些參數以及參數之間的逗號構成 arg 的值,在宏擴展
時替換 arg,例以下列代碼:
pr _ debug("%s:%d",filename,line)
會被擴展爲:
printk("%s:%d", filename, line)
使用「##」的緣由是處理 arg 不表明任何參數的狀況,這時候,前面的逗號就變得多餘了。使用「##」
以後,GNU C 預處理器會丟棄前面的逗號,這樣,代碼:
pr _ debug("success!\n")
會被正確地擴展爲:
printk("success!\n")
而不是:
printk("success!\n",)函數
此篇文章來源於華清遠見文檔debug