对函数体中声明的名称进行非限定名称查找

Unqualified name lookup of the name declared into the function body

本文关键字:定名称 查找 函数体 声明      更新时间:2023-10-16

我遇到过声明定义:

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

#include <stdio.h>
void foo()
{
    printf("foon");
}

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

在3.3中说

声明的作用域与其潜在作用域相同,除非潜在作用域包含另一个同名声明。

问题1。这是否意味着,在我的情况下,当我们重新声明foo到主函数中,重新声明的foo实际上表示的实体不同于声明到全局作用域的foo所表示的实体?

问题2。为什么不限定名称查找解析给出一个由"global"foo表示的实体?

乌利希期刊指南:如果我们考虑以下

#include <stdio.h>
int a=42;
int main()
{
    int a;
    printf("%dn",a); //Garbage
}

则函数作用域中的a不表示全局的a。怎么解释呢?

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

2。我想第一个答案也回答了这个问题。foo()只有一个定义,它在全局范围内。因此非限定名查找将引用那个

编辑

在后面的例子中,main中定义了 a,这隐藏了全局的a。从你的第一个报价:

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

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