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

我有一个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扩展var##12 to var12

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

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

因为##是c预处理器的令牌串联运算符。

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

##是令牌粘贴操作员

双数字符号或“token-pasting”运算符(##),有时称为“合并”运算符,用于类似对象和类似函数的macros。 它允许单独的令牌被join到单个令牌中,因此不能成为macros定义中的第一个或最后一个令牌。

如果macros定义中的forms参数在标记粘贴操作符之前或之后,则forms参数立即被未扩展的实际参数replace。 在replace之前,macros观扩展不会在参数上执行。

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

##被用来连接c-preprocessor中的两个macros。 所以在编译f(var,12)之前应该用var12来replace预处理器,因此你得到了输出。