我有一份以下的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
的吗?
我有一份以下的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
的吗?
没什么太花哨的: ##
告诉预处理器将左右两边连接起来
参见http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation
因为“##”是C预处理器的令牌连接运算符。
或者也许我没有理解这个问题。
##
是Token Pasting Operator(标记粘贴运算符)
双数字符号或“标记粘贴”运算符(##),有时也称为“合并”运算符,用于对象宏和函数宏中。它允许将单独的标记组合成一个标记,因此不能是宏定义中的第一个或最后一个标记。
如果宏定义中的形式参数之前或之后跟随标记粘贴运算符,则形式参数会立即被未展开的实际参数替换。在替换之前不会对参数执行宏展开。
#define f(g,g2) g##g2
在c预处理器中,##用于连接两个宏。因此,在编译之前,f(var,12)应该由预处理器替换为var12,从而得到输出结果。
##
的含义。这就像在问“为什么i++
会使i
增加?”一样。因为 C 标准规定了这个行为! - Alok Singhal