声明在函数体中的名称的非限定名称查找

时间:2014-05-14 05:03:07

标签: c++ declaration name-lookup

我在声明定义中遇到过:

  

声明是一个定义,除非声明没有的函数   指定函数的主体

#include <stdio.h>
void foo()
{
    printf("foo\n");

}



int main()
{
    void foo();
    foo();
}

在3.3说

  

声明的范围与其潜在范围相同,除非   潜在范围包含另一个同名声明。

问题1。这是否意味着在我的情况下,当我们将foo重新声明为主函数时,重新声明的foo实际上表示与声明为全局范围的foo表示的实体不同的实体?

问题2。为什么不合格的名称查找解析会给出一个由&#34; global&#34;表示的实体。 FOO?

UPD: 如果我们考虑以下

#include <stdio.h>
int a=42;

int main()
{
    int a;
    printf("%d\n",a); //Garbage
}

然后函数范围内的a没有表示全局a。怎么解释呢?

1 个答案:

答案 0 :(得分:1)

1。不,它表示全局foo()。在main中,您重新声明名称,而不是定义。如果有foo的另一个定义,那么它将违反One Definition Rule,程序将无法编译。

2. 我想第一个答案也回答了这个问题。 foo()只有一个定义,它在全球范围内。因此,不合格的名称查找将引用该名称。

修改

在后面的示例中,您在a定义 main,隐藏了全局a。从你的第一句话开始:

A declaration is a definition unless it declares a function without specifying the function’s body

a 不是函数,因此声明也是一个定义,它隐藏了a的先前定义。