[英]“##” in printk, what does ## mean
#define ext4_debug(f, a...) \
do { \
printk(KERN_DEBUG "EXT4-fs DEBUG (%s, %d): %s:", \
__FILE__, __LINE__, __func__); \
printk(KERN_DEBUG f, ## a); \
} while (0)
我不明白的是這個
printk(KERN_DEBUG f, ## a);
有人能幫我理解這行中的##是什么? 謝謝
它是可變參數宏的標記(具有多個可變參數的宏)。 它的gcc特定指令允許在ext4_debug()
f
之后輸入0或更多參數作為輸入。 這意味着, f
參數是強制性的, a
可能存在也可能不存在。
這與printf(const char *fmt,...)
,其中, fmt
是必需的,其他參數是可選的並且取決於fmt
。 請參閱此文檔中的最后一條聲明: http : //gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
如果你傳入0個參數,那就是使可變參數宏(可以帶多個參數的宏)起作用。
從GCC手冊中的Variadic宏部分 :
其次,## token paste運算符在逗號和變量參數之間具有特殊含義。 如果你寫
#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
當使用
eprintf
宏時,eprintf
變量參數,然后刪除##之前的逗號。 如果傳遞一個空參數,則不會發生這種情況,如果##之前的標記不是逗號,也不會發生這種情況。eprintf ("success!\\n") ==> fprintf(stderr, "success!\\n");
如果你沒有使用它,那么它將擴展為frpintf(stderr, "success!\\n",)
,這是一個語法錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.