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)
Inside
main
都被替换

道德的
  • 宏既不是函数也不是变量
  • 不要使用前导双下划线(来自注释)
  • 在询问之前进行校对,不要彻底改变你的帖子

  • 使用
    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;
    }