用c语言编写的宏评估
可能重复:
“#define STR(a)#a”做什么?
#include <stdio.h>
#define f(a,b) printf("yes")
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%sn",h(f(1,2)));
printf("%sn",g(f(1,2)));
}
有人可以解释为什么printf()语句的输出不同。
由于预处理器执行的操作的顺序不同,输出不同,这在C99标准的6.10.3节(以及后面的章节)中有描述。 特别是6.10.3.1/1中的这句话:
在替换列表中的参数,除非前面由#
或##
预处理记号或后跟一个##
预处理记号,由相应的参数之后替换包含在其中的所有宏已经扩大。
因此,在第一行中,扩展h
的调用h
,参数f(1,2)
在扩展h
的参数a
之前展开。 只有当所有被重新扫描的输出结果为g
时,才会发挥#
作用。
但是在第二行中, #
立即被看到,并且上面的引用中的“除非...在...之前......”从句触发不同的行为。
另请参阅相关的C-FAQ条目。
预处理器完成宏扩展后,编译器会看到:
int main()
{
printf("%sn","printf("yes")");
printf("%sn","f(1,2)");
}
这是一种常见的技术,可以在“额外”间接中进行分层,以控制何时得到字符串化以及何时得到实际的宏评估。
基本上,宏观评估是从“外部进来”发生的,而不是相反。 维基百科页面显示“参数不是先解析宏替换”,我相信这是指同一件事情。
链接地址: http://www.djcxy.com/p/84411.html