【问题标题】:"##" in printk, what does ## meanprintk中的“##”,##是什么意思
【发布时间】:2012-11-05 04:27:29
【问题描述】:
#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); 

谁能帮我理解这一行中的## 是什么? 谢谢

【问题讨论】:

  • @Insilico 那是不正确的人,问的问题是不同的。关于可变参数宏的预处理器指令“##”,请注意您只有##a,而不是g##a
  • Aniket 是对的,这不是重复的,因为 ## 在此上下文中的含义与该问题中给出的上下文不同。每个人都投票以重复关闭:在这样做之前请仔细阅读。

标签: c c-preprocessor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    来自 GCC 手册中的Variadic Macros section

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

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

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

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

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

    【讨论】:

    • 正是我一直在告诉人们这不是令牌贴纸
    • 请重新投票,这个问题不是重复的,并且在不知不觉中被一些人关闭了。这个问题有微妙的不同和原创性
    • @Aniket 我已重新投票;我怀疑你和我已经这样做了。感谢您在这里纠正人们;当每个人都过快地跳出错误的答案或错误的投票决定时,这是令人沮丧的。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-04-18
    相关资源
    最近更新 更多