在printk中"##",##是什么意思

And*_*ind 6 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)
Run Code Online (Sandbox Code Playgroud)

我不明白的是这个

printk(KERN_DEBUG f, ## a); 
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ell 2

如果您传入 0 个参数,它的作用是使可变参数宏(可以接受多个参数的宏)起作用。

来自GCC 手册中的可变参数宏部分:

其次,## 标记粘贴运算符在放置在逗号和变量参数之间时具有特殊含义。如果你写

#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

如果使用宏时省略了变量参数eprintf,则##前面的逗号将被删除。如果传递空参数,则不会发生这种情况;如果 ## 前面的标记不是逗号,则不会发生这种情况。

eprintf ("success!\n")
     ==> fprintf(stderr, "success!\n");
Run Code Online (Sandbox Code Playgroud)

如果您没有使用它,那么它将扩展为frpintf(stderr, "success!\n",),这是一个语法错误。