標準 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",)
可變引數巨集
在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 void printf con...
可變引數巨集
參考各可變引數的部落格,才寫出現在的部落格,有不準確之處,還望指出。1.先看些標準c中printf函式原型 標準c就支援可變引數巨集,也就意味著函式的引數是不固定的,例如printf 函式的原型為 int printf const char format,在gnu c中,巨集也可以接受可變數目的引數...
可變引數巨集
可變引數巨集 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 void pr...