【问题标题】:What does ## mean for the C(C++) preprocessor?## 对 C(C++) 预处理器意味着什么?
【发布时间】:2011-01-02 19:24:44
【问题描述】:

我在下面有一个 C 程序:

#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}

当我只运行预处理器时,它会将其扩展为

{
int var12=100;
printf("%d",var12);
}

这就是输出为 100 的原因。

谁能告诉我预处理器如何/为什么扩展var##12 to var12

【问题讨论】:

  • 因为这就是 ## 在 C 预处理器中的含义。这就像说“为什么i++ 增加i?”。因为 C 标准是这么说的!
  • @Richo....这不是家庭作业。因为我对预处理器不太熟悉,所以我有这个问题。这对你来说可能很容易,看起来像家庭作业.但是对于那些不知道的人来说,这并不容易理解。
  • 我确定这一定是重复的,但是在搜索 ## 时,google 和 SO 搜索当然都失败了

标签: c c-preprocessor stringification


【解决方案1】:

没什么太花哨的:## 告诉预处理器连接左侧和右侧

http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

【讨论】:

    【解决方案2】:

    因为 ## 是 c 预处理器的标记连接运算符。

    或者我不明白这个问题。

    【讨论】:

    • 它连接标记,而不是字符串。
    【解决方案3】:

    ##Token Pasting Operator

    双数字符号或“标记粘贴”运算符 (##),有时称为“合并”运算符,用于类对象宏和类函数宏。它允许将单独的标记连接到单个标记中,因此不能是宏定义中的第一个或最后一个标记。

    如果宏定义中的形参前面或后面有记号粘贴运算符,则形参立即被未展开的实参替换。在替换之前不对参数执行宏扩展。

    【讨论】:

      【解决方案4】:

      #define f(g,g2) g##g2

      ## 用于连接 c 预处理器中的两个宏。 所以在编译 f(var,12) 之前应该用 var12 替换预处理器,因此你得到了输出。

      【讨论】:

        猜你喜欢
        • 2012-10-10
        • 2021-09-30
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2012-05-29
        相关资源
        最近更新 更多