为什么我没有在以下c程序中获得预期的输出?

可能重复:
“#define STR(a)#a”有什么作用?
c编程语言中的宏评估

#include  #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的输出相同。 但我得到的是不同的(如下所示)

 12 f(1,2) 

有人可以解释是什么原因以及为什么会发生这种情况?

我用一条额外的线扩展了你的程序

 printf("%d\n",f(1,2)); 

反过来,这导致了

 printf("%d\n",12); 

(用gcc -E调用)。

你的两行结果

 printf("%s\n","12"); printf("%s\n","f(1,2)"); 

这里发生了什么?

f(1,2)是清楚的 – 12只是粘在一起。

g(something)只是将something重现为一个字符串,而不是特别对待它 – > "f(1,2)"

反过来, h(something)g(something)的结果扩大。

C标准规定,如果宏参数被字符串化或连接,则不会扩展它们。 这就是g(YOUR_MACRO) YOUR_MACRO未展开的原因。 但是在h(YOUR_MACRO)情况下 – h() 间接进行字符串化,因此它符合C宏参数扩展规则并进一步扩展。

第一:

  printf("%s\n",h(f(1,2))); 

变为:

  g(12) 

而这反过来成为

  "12" 

第二个:

 printf("%s\n",g(f(1,2))); 

 "f(1,2)" 

因为#将参数转换为字符串参数。