#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
会引入它指定的文件的内容,并且可以使预处理器输出相当长。