C(C++)预处理器中的##代表什么意思?

14

我有一份以下的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 扩展成 var12的吗?


9
因为这就是 C 预处理器中 ## 的含义。这就像在问“为什么 i++ 会使 i 增加?”一样。因为 C 标准规定了这个行为! - Alok Singhal
3
“@Richo....这不是一份作业。由于我对预处理器不太熟悉,我有这个问题。这可能很容易对你来说,看起来像是一份作业,但对于那些不了解的人来说,这并不容易理解。” - Vijay
我相信这一定是重复的,但当涉及到搜索##时,谷歌和SO搜索都失败了。 - John Carter
4个回答

33

6

因为“##”是C预处理器的令牌连接运算符。

或者也许我没有理解这个问题。


1
它连接标记,而不是字符串。 - Emerick Rogul

6

##Token Pasting Operator(标记粘贴运算符)

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

如果宏定义中的形式参数之前或之后跟随标记粘贴运算符,则形式参数会立即被未展开的实际参数替换。在替换之前不会对参数执行宏展开。


2

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

在c预处理器中,##用于连接两个宏。因此,在编译之前,f(var,12)应该由预处理器替换为var12,从而得到输出结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接