#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
上面的程序通过连接var和12来打印C中的100。g##g2是如何工作的?
#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
##
只是将标记粘合在一起。它是一个预处理器指令。
例如:
#define PASTE(a,b) a##b
int i=PASTE(1,2); /* int i=12; */
预处理器正在执行连接操作,因为您使用了##
命令。
当您不确定预处理器正在执行什么操作时,可以要求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);
}
你可以通过向gcc传递-E
选项来生成预处理器输出。
$ gcc -E pre.c
# 1 "pre.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "pre.c"
void main()
{
int a = 123;
int b = 1234567;
char* c = "IGetQuoted";
}
#include
将会引入指定文件的内容,并且可能会使预处理器输出变得相当冗长。##
是预处理器的“命令”,用于将前后内容连接起来。
所以在预处理之后,它会变成这样:
main()
{
int var12=100;
printf("%d",var12);
}