与嵌套宏扩展混淆

时间:2016-03-28 12:30:34

标签: 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;
}

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

in ___foo
in foo
=> 3

虽然我以为这会导致递归调用?

编辑:宏应在定义__foo()

后定义

2 个答案:

答案 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. 宏既不是函数也不是变量
  2. 不要使用领先的双下划线(来自评论)
  3. 在询问之前校对并且不要彻底改变你的帖子

答案 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;
}