对函数体中声明的名称进行非限定名称查找
Unqualified name lookup of the name declared into the function body
我遇到过声明定义:
声明是定义,除非它声明了一个没有的函数指定函数体
#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
前面的定义。
相关文章:
- 折叠表达式和函数名称查找
- enable_if继承的成员函数的名称查找错误
- 限定的依赖名称查找,其中包含基类的注入类名
- 假设声明中某些上下文中需要的名称查找规则是什么
- 尝试了解模板和名称查找
- 哪里定义了查找名称最直接声明的名称查找规则
- 模板库中的名称查找:为什么我们要添加这个>
- DEV C++ 第 69 行 [错误] ISO "for" 范围更改了"i"的名称查找 [-允许]
- 重载解析、名称查找和函数指针
- C++11/14/17,GCC 7 与 GCC 8:好友类模板的名称查找
- 按名称查找进程 ID 的快速方法
- 这是如何运作的?(C 名称查找魔术)
- C++中成员名称查找和访问声明中的歧义
- 如何解决非限定名称查找问题
- 为什么名称查找在找到使用 using 指令隐式声明的实体时不停止?
- C++名称查找来自 <time.h 的函数>
- C++嵌套的"命名空间""使用"名称查找首选项顺序
- 不同编译器的名称查找的不一致性
- C++中名称查找和名称绑定之间的区别
- 模板功能中的名称查找规则