在printk中“##”,##是什么意思

时间:2012-11-05 04:27:30

标签: c c-preprocessor

#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); 

有人能帮我理解这行中的##是什么? 谢谢

2 个答案:

答案 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",),这是一个语法错误。