与嵌套宏扩展混淆

Ami*_*rma -5 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));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出: 我从上面的实验中收到的输出是:

in ___foo
in foo
=> 3
Run Code Online (Sandbox Code Playgroud)

虽然我期待这会导致递归调用?

编辑:宏定义后应定义__foo()

Moh*_*ain 6

您的代码不应该链接C.

第一个功能int foo(int x)将被替换为

int __foo(int x)
Run Code Online (Sandbox Code Playgroud)

因为宏观替代.但后来有另一个具有相同名称的函数会导致链接时间错误.这应该给出编译时错误.

如何查看递归然后
将宏定义移动到第一个函数下面:

int foo(int x) {
  ...
}

#define foo(x) __foo(x)
int __foo(int x) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

经过剧烈的变化后

定义宏foo的所有文本foo(something)将被__foo(something)替换.在main函数输入之前,宏foo没有定义,所以没有替换.在内部main,宏被定义,因此所有出现的foo(x)内部main都被替换.

道德

  1. 宏既不是函数也不是变量
  2. 不要使用前导双下划线(来自评论)
  3. 在询问之前校对并且不要大幅改变你的帖子