#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);
有人能帮我理解这行中的##是什么? 谢谢
答案 0 :(得分:3)
它是可变参数宏的标记(具有多个可变参数的宏)。它的gcc特定指令,在f
ext4_debug()
之后允许0个或多个参数作为输入。这意味着,f
参数是必需的,a
可能存在也可能不存在。
这与printf(const char *fmt,...)
相同,其中fmt
是必需的,其他参数是可选的,取决于fmt
。请参阅此文档中的最后一条语句:http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
答案 1 :(得分:2)
如果传入0个参数,可以使可变参数宏(可以采用多个参数的宏)起作用。
来自GCC手册中的Variadic Macros section:
其次,当放置在逗号和变量参数之间时,## token paste运算符具有特殊含义。如果你写
#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
并且在使用
eprintf
宏时省略变量参数,然后删除##之前的逗号。如果传递一个空参数,则不会发生这种情况,如果##之前的标记不是逗号,也不会发生这种情况。eprintf ("success!\n") ==> fprintf(stderr, "success!\n");
如果你没有使用它,那么它会扩展为frpintf(stderr, "success!\n",)
,这是一个语法错误。