需要解释以下代码:
#include <stdio.h>
int foo(int x) {
printf("in foo\n");
return x;
}
int __foo(int x) {
printf("in ___foo\n");
int y = foo(x);
return y + 1;
}
#define foo(x) __foo(x)
int main()
{
printf("=> %d\n", foo(2));
return 0;
}
输出: 我从上述实验中收到的输出是:
in ___foo
in foo
=> 3
虽然我以为这会导致递归调用?
编辑:宏应在定义__foo()
答案 0 :(得分:6)
您的代码不应链接到C
。
第一个函数int foo(int x)
将替换为
int __foo(int x)
因为宏观更换。但后来有另一个具有相同名称的函数会导致链接时间错误。这应该会产生编译时错误。
如何查看递归然后
将宏定义移到第一个函数下面:
int foo(int x) {
...
}
#define foo(x) __foo(x)
int __foo(int x) {
...
}
定义宏foo的所有文本foo(something)将替换为__foo(something)。在输入main
函数之前,未定义宏foo
,因此没有替换。在main
内,定义了宏,因此foo(x)
内main
的所有出现都会被替换。
答案 1 :(得分:3)
使用clang -E
进行预处理:
int foo(int x) {
printf("in foo\n");
return x;
}
int __foo(int x) {
printf("in ___foo\n");
int y = foo(x);
return y + 1;
}
int main()
{
printf("=> %d\n", __foo(2));
return 0;
}
这应该足够明确,以回答你的问题。
要获得递归,请尝试:
#include <stdio.h>
int foo(int x) {
printf("in foo\n");
return __foo(x); // <--- Here is the difference
}
int __foo(int x) {
printf("in ___foo\n");
int y = foo(x);
return y + 1;
}
#define foo(x) __foo(x)
int main()
{
printf("=> %d\n", foo(2));
return 0;
}