#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
上面的程序通过连接var和12在c中打印100. g ## g2如何工作?
答案 0 :(得分:8)
##
只是将令牌粘贴在一起。它是一个预处理器指令。
E.g。
#define PASTE(a,b) a##b
int i=PASTE(1,2); /* int i=12; */
答案 1 :(得分:0)
##
是预处理器“命令”,用于连接之前和之后的内容。
答案 2 :(得分:0)
因此,在预处理之后,它将如下所示:
main()
{
int var12=100;
printf("%d",var12);
}
答案 3 :(得分:0)
这是标记粘贴,为gcc描述here。令牌粘贴由预处理器完成,而不是编译器。
答案 4 :(得分:0)
预处理器正在执行连接,因为您使用了##
命令。
当您不确定预处理器正在做什么时,可以要求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 "<built-in>"
# 1 "<command-line>"
# 1 "pre.c"
void main()
{
int a = 123;
int b = 1234567;
char* c = "IGetQuoted";
}
请记住,#include
将提取它指定的文件的内容,并且可以使预处理器输出相当长。