6

我在从 printf() 语句中理解宏函数调用的使用方面遇到了问题。

我有以下代码:

#include<stdio.h>
#define f(g,h) g##h
main()
{
    printf("%d",f(100,10));
}

此代码输出“10010”作为答案。

我了解到宏函数调用只是复制粘贴宏函数代码来代替调用,并替换了参数。

所以代码应该是这样的:

#include<stdio.h>
#define f(g,h) g##h
main()
{
    printf("%d",100##10);
}

但是当我用替换的宏单独执行上述代码时,我得到一个编译错误。

那么第一个代码如何给出 10010 作为答案,而第二个代码给出编译错误呢?

4

3 回答 3

15

预处理器连接运算符在宏被替换之前##完成。它只能用于宏体。

于 2012-11-26T09:15:38.150 回答
1

运算符##对于预处理器具有特殊意义,它是一个标记粘贴运算符,将两个标记“粘合”在一起。因此,在您的情况下,g并且h“粘合”在一起,从而产生了新的 token - int literal 10010

于 2012-11-26T09:15:45.713 回答
1

有一些特殊字符(例如##宏中的一些特殊字符)会更改“仅替换文本”规则。

于 2012-11-26T09:16:24.107 回答