我在下面有一个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程序:
#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
?
没什么太花哨##
的:告诉预处理器连接左侧和右侧
见http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation
因为 ## 是 c 预处理器的标记连接运算符。
或者也许我不明白这个问题。
##
是令牌粘贴运算符
双数字符号或“标记粘贴”运算符 (##),有时称为“合并”运算符,用于类对象宏和类函数宏。它允许将单独的标记连接到单个标记中,因此不能是宏定义中的第一个或最后一个标记。
如果宏定义中的形参前面或后面有记号粘贴运算符,则形参立即被未展开的实参替换。在替换之前不对参数执行宏扩展。
#define f(g,g2) g##g2
## 用于连接 c 预处理器中的两个宏。所以在编译 f(var,12) 之前应该用 var12 替换预处理器,因此你得到了输出。