【问题标题】:Double hash before parameter in function call函数调用中参数前的双哈希
【发布时间】:2011-10-24 18:25:24
【问题描述】:

我在 C 中看到这一行:

#define log(format, args...) snprintf(buffer + strlen(buffer), 1023 - strlen(buffer), format, ##args);

snprintf() 中最后一个参数之前的双磅/哈希是什么意思?

【问题讨论】:

    标签: c++ c c-preprocessor


    【解决方案1】:

    在标准 C 中,“##”用于在宏中将标记连接在一起。在这里,这个宏不是在标准 C 中,而是在“Gnu C”中,由GCC 实现的方言。如果额外的参数(args)结果为空,则“##”用于删除逗号。见the GCC manual

    【讨论】:

    • 很遗憾 GCC 会重用已定义的运算符,而不是想出一些独特的东西。
    • @Mark:为他们辩护,GCC 的人在标准 C 中没有任何这样的东西之前定义了带有可变数量参数的宏的语法。两种语法可以共存。
    【解决方案2】:

    那是"token-pasting"preprocessoroperator,我认为这个宏没有正确使用它。

    【讨论】:

    【解决方案3】:

    这是一个 gcc 扩展(args... 也是如此,C99 版本是使用...__VA_ARGS__)如果变量参数列表args 为空,则删除最后的逗号。

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 1970-01-01
      • 2016-06-20
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2018-04-02
      相关资源
      最近更新 更多