用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

上一篇: Macros evaluation in c programming language

下一篇: Using Case/Switch and GetType to determine the object