C 与嵌套宏展开混淆
需要解释以下代码:C 与嵌套宏展开混淆,c,macros,C,Macros,需要解释以下代码: #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)
#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;
}
然而我期望这会导致递归调用
编辑:宏应在定义
\uuuufoo()
后定义,您的代码不应链接到C
第一个函数intfoo(intx)
将替换为
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)
Insidemain
都被替换
道德的
使用
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;
}
#包括
intfoo(intx){
printf(“在foo\n中”);
return _foo(x);//与您的问题无关,但是带有两个前导下划线的符号是为“实现”(编译器和标准库)保留的。自从您最初发布以来,您已经对其进行了相当大的更改,使一些答案变得毫无意义。请不要在回答问题后对其进行重大更改。这可能会使给定的答案无法理解。因此,我回滚了您上次的编辑。添加此类“更改”作为现有问题的补充,而不是更改。@AmitSharma:他可能做了,这就是为什么他知道…;-)当我做蠢事时,我倾向于不公布事实是的,我更新了代码。+1用于显示预处理器结果。如果你不记住有一个预处理器生成实际代码,你就无法理解宏。@AmitSharma回答updated@sunqingyao,这意味着它只会替换定义宏后所做的调用,对吗?@AmitSharma是的,确实如此。是的,已经更新了代码。请检查。谢谢
#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;
}