【发布时间】:2020-01-28 14:30:54
【问题描述】:
在以下代码中,foo() 在两个不同的地方被解析并调用两个不同的函数(由******** 标记)。
#include <cstdio>
typedef int (*func)(void);
int bar()
{
printf("bar\n");
return 4; // guaranteed to be random
}
int foo()
{
printf("foo\n");
static int i = 0;
if(i)
return i;
++i;
i = foo(); // recursive call ********
printf("%d\n", i);
func foo = bar;
i = foo(); // calls bar. Why? ********
printf("%d\n", i);
return i;
}
int main()
{
return foo();
}
在我能够尝试的所有编译器(gcc, clang、MSVC 和其他几个)中,输出是:
富
富
1
酒吧
4
为什么编译器选择通过函数指针调用bar并屏蔽递归调用?是否定义了这种行为?如果有,可以给个参考吗?
【问题讨论】:
-
func foo = bar;表示第二次调用foo调用bar。 -
为什么要和
int i = 5; { int i; i = 6; } assert(i == 5);不同? -
对我来说看起来像是常规的名称阴影。
foo在局部范围阴影foo在全局范围内。 -
@Nicol 谢谢你的复制。正是我想要的(特别是 3.3.10.2)。
-
@StoryTeller-UnslanderMonica 我不知道变量隐藏与函数有关。
标签: c++ language-lawyer