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

Vij*_*jay 12 c stringification c-preprocessor

我有一个C程序如下:

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

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

{
int var12=100;
printf("%d",var12);
}
Run Code Online (Sandbox Code Playgroud)

这就是输出为100的原因.

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

cob*_*bal 28

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

请参阅http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation


Ste*_*ini 6

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

或许我不明白这个问题.


Pra*_*rav 5

##令牌粘贴运算符

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

如果宏定义中的形式参数在令牌粘贴运算符之前或之后,则形式参数将立即由未扩展的实际参数替换。替换前不对参数进行宏扩展。