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

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

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

2
这不是一个程序,而是一个宏。在您喜欢的C/C++语言书中查找“token-pasting operator”。 - Hans Passant
2
@nobugz:什么?上面的确实是一个程序,尽管不是完全合法的C代码。这个程序打印出100。程序中有一个宏,但是Shishir说“上面的程序打印100”时,他不是正确地指的整个程序而不是宏吗? - Steve Jessop
5个回答

9

## 只是将标记粘合在一起。它是一个预处理器指令。

例如:

#define PASTE(a,b)  a##b

int i=PASTE(1,2);  /* int i=12; */

1
谢谢你清晰明了的解释。 - Kush Singla

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);
}

你可以通过向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将会引入指定文件的内容,并且可能会使预处理器输出变得相当冗长。

0

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


0

所以在预处理之后,它会变成这样:

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

0
这是令牌粘贴,对于gcc在这里进行了描述。令牌粘贴是由预处理器而不是编译器完成的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接