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

时间:2011-11-09 08:41:05

标签: c macros

  

可能重复:
  What does “#define STR(a) #a” do?
  Macros evaluation in c programming language

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

12
f(1,2)

有人可以解释原因是什么,为什么会详细发生?

3 个答案:

答案 0 :(得分:3)

我用额外的一行扩展你的程序

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重现为字符串,而不是特别处理它 - &gt; "f(1,2)"

反过来,

h(something)会让g(something)的结果展开。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

第一个:

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

变为:

  g(12)

反过来成为

  "12"

第二个:

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

变为

"f(1,2)"

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

相关问题