可能重复:
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)
有人可以解释原因是什么,为什么会详细发生?
答案 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)
很明显 - 1
和2
只是紧密相连。
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)"
因为#
将参数转换为字符串参数。