2016-03-28 44 views
-5

需要说明:混淆在下面的代码段嵌套宏扩展

#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; 
} 

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

in ___foo 
in foo 
=> 3 

尽管我期待这会导致递归调用?

编辑:宏应该的__foo()

+1

是否编译? –

+0

这意味着只有'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; 
} 
+0

是的,我已经更新了代码。 –

+0

+1用于显示预处理器结果。如果不记住预处理器生成实际代码,则无法理解宏。 – jdarthenay

+0

@AmitSharma回答更新 –

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被定义的将会被__foo(东西)所取代。直到输入main函数,宏foo没有被定义,所以没有替换。在main内部,定义了宏,因此在main内的所有出现foo(x)都被替换。

道德

  1. 宏既不是函数也不是变量
  2. 要求之前,请不要使用领先的双下划线(从评论)
  3. 校对和不改变你的后大幅
+0

是的,已经更新了代码。请检查。谢谢 –