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

时间:2009-11-28 19:22:02

标签: c

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

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

5 个答案:

答案 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将提取它指定的文件的内容,并且可以使预处理器输出相当长。