## 对于 C(C++) 预处理器意味着什么?

问题描述 投票:0回答:4

我有一个下面的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 c-preprocessor stringification
4个回答
36
投票

没什么太花哨的:

##
告诉预处理器连接左侧和右侧。

请参阅此处。


6
投票

##
令牌粘贴运算符

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

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


6
投票

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

或者也许我不明白这个问题。


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.