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

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

上面的程序通过连接var和12来打印100 in c。g ## g2如何工作?

##只是将令牌粘贴在一起。 它是一个预处理器指令。

例如

 #define PASTE(a,b) a##b int i=PASTE(1,2); /* int i=12; */ 

##是预处理器“命令”,用于连接之前和之后的内容。

这是标记粘贴, 这里描述的是gcc。 令牌粘贴由预处理器完成,而不是编译器。

因此在预处理之后它将如下所示:

 main() { int var12=100; printf("%d",var12); } 

由于您使用了##命令,因此预处理器正在执行连接。

当您不确定预处理器正在做什么时,您可以要求gcc在运行预处理器后停止。 由于这是在编译器运行之前,因此输出相当容易理解。

例如,假设您有一个pre.c文件

 #define FOO 123 #define CONCAT(x,y) x##y #define STRING(x) #x void main() { int a = FOO; int b = CONCAT(123,4567); char* c = STRING(IGetQuoted); } 

您可以通过将-E选项传递给gcc来生成预处理器输出。

 $ gcc -E pre.c # 1 "pre.c" # 1 "" # 1 "" # 1 "pre.c" void main() { int a = 123; int b = 1234567; char* c = "IGetQuoted"; } 

请记住, #include会引入它指定的文件的内容,并且可以使预处理器输出相当长。