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 to var12

4

4 回答 4

31

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

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

于 2010-01-08T06:19:17.517 回答
6

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

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

于 2010-01-08T06:19:31.603 回答
5

##令牌粘贴运算符

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

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

于 2010-01-08T06:21:41.063 回答
2

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

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

于 2010-01-08T09:23:37.377 回答