我在使用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作为答案,而第二个代码给出了编译错误?
答案 0 :(得分:15)
在替换宏之前,预处理器并置运算符##
已完成。它只能在宏体中使用。
答案 1 :(得分:1)
运算符##
具有预处理器的特殊含义,它是一个标记粘贴运算符,它将两个标记“粘合”在一起。因此,在您的情况下,g
和h
被“粘合”在一起,从而产生新的令牌 - int literal 10010
。
答案 2 :(得分:1)
宏中有一些特殊字符,如##
,可以更改规则“只需替换文字”。