C 带哈希的预处理器指令

C 带哈希的预处理器指令,c,c-preprocessor,preprocessor-directive,C,C Preprocessor,Preprocessor Directive,此代码给出输出100,但如果实现了预处理器,printf将重写为: #define f(g,g2) g##g2 main() { int var12=100; printf("%d",f(var,12)); } 那么,输出是如何产生的呢?双哈希##是预处理器的一部分。printf将按如下方式重新编写: printf("%d",var##12); 双数字符号或“标记粘贴”运算符(##),有时称为“合并”运算符,用于类对象宏和类函数宏。它允许将单独的令牌加入到单个令牌中,因此不能是宏定义中的第一

此代码给出输出100,但如果实现了预处理器,
printf
将重写为:

#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
那么,输出是如何产生的呢?

双哈希
##
是预处理器的一部分。
printf
将按如下方式重新编写:

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


因为
f(var,12)
被替换为
var12
,这是您在上一行中声明和分配的变量的名称。预处理器指令
##
将这两个参数粘贴在一起。

您所说的实现是什么意思?此“标记粘贴”运算符仅在宏定义中使用还是在程序的其他地方也使用?@Ceres111标记粘贴运算符由预处理器定义,因此在宏外部无效。您可以将其与函数样式和“类似对象”的宏一起使用,也就是说,可以编写
#define MYVAR##12
,然后编写
printf(“%d”,MYVAR)
printf("%d",var12); // No double-hash