#include <stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
return 0;
}
只需查看该程序,人们“可能”就会期望两个 printf 语句的输出相同。但在运行该程序时,您会得到它:
bash$ ./a.out
12
f(1,2)
bash$
为什么会这样呢?
类似函数的宏中出现的参数,除非它是以下操作数#
or ##
,在替换它并重新扫描整体以进一步扩展之前进行扩展。因为g
的参数is的操作数#
,参数不会扩展,而是立即字符串化("f(1,2)"
)。因为h
的参数is not的操作数#
nor ##
,参数首先被扩展(12
),然后代入(g(12)
),然后重新扫描并进一步扩展("12"
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)