为什么我没有在以下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)
是清楚的 – 1
和2
只是粘在一起。
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)"
因为#
将参数转换为字符串参数。