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

有人可以帮我理解这一行中的## 是什么吗?谢谢你

4

2 回答 2

3

它是可变参数宏(具有多个可变参数的宏)的标记。它的 gcc 特定指令允许 0 个或多个参数作为 in 之后的f输入ext4_debug()。这意味着,f参数是强制性的,a可能存在也可能不存在。

printf(const char *fmt,...)这与where相同,fmt是强制的,其他参数是可选的并且依赖于fmt. 请参阅此文档中的最后一条语句:http: //gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

于 2012-11-05T04:36:15.220 回答
2

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

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

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

#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)

并且在使用宏时省略了变量参数eprintf,那么##之前的逗号将被删除。如果您传递一个空参数,则不会发生这种情况,如果 ## 之前的标记不是逗号,也不会发生这种情况。

eprintf ("success!\n")
     ==> fprintf(stderr, "success!\n");

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

于 2012-11-05T04:40:06.420 回答