可能的重复:
宏中的 # 和 ## https://stackoverflow.com/questions/4364971/and-in-macros
为什么第二个 printf 的输出是 f(1,2) 宏的计算顺序是什么?
#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;
}
output 12
f(1,2)
From http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan
宏参数在替换到宏体中之前会被完全宏扩展,除非它们被字符串化或与其他标记一起粘贴。替换后,将再次扫描整个宏体(包括替换的参数)以查找要扩展的宏。结果是参数被扫描两次以扩展其中的宏调用。
Meaning:
- f 连接其参数,因此其参数不会扩展
- h 不会字符串化或连接其参数,因此其参数被扩展。
- g 对其参数进行字符串化,因此其参数不会扩展
h(f(1,2)) -> g(12) -> "12"
g(f(1,2)) -> "f(1,2)"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)