繁体   English   中英

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

[英]“##” 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM