未命名的命名空间
Unnamed namespace
有以下代码:
#include <iostream>
using namespace std;
namespace
{
int funkcja()
{
cout << "unnamed" << endl;
return 0;
}
}
int funkcja()
{
cout << "global" << endl;
return 0;
}
int main()
{
::funkcja(); //this works, it will call funkcja() from global scope
funkcja(); //this generates an error
return 0;
}
我使用g++。在这种情况下,是否有某种方法可以从未命名的命名空间调用函数?可以使用::function从全局范围调用函数,但如何从未命名的命名空间调用函数?编译器生成错误:
prog3.cpp: In function ‘int main()’:
prog3.cpp:43:17: error: call of overloaded ‘funkcja()’ is ambiguous
prog3.cpp:32:5: note: candidates are: int funkcja()
prog3.cpp:25:6: note: int<unnamed>::funkcja()
匿名命名空间的工作方式是,在它们内部声明的名称在封闭范围中自动可见,就像发出了using namespace name_of_anonymous_namespace;
一样。
正因为如此,在您的示例中,名称funkcja
不明确且不可消除歧义[新词!]。看起来您并不是真的想要一个匿名命名空间,而是真的需要一个命名正确的命名空间。
在这种情况下,有没有办法从未命名的命名空间调用函数
不,不是你的情况。
匿名/未命名命名空间允许变量和函数在整个翻译单元内可见,但在外部不可见。尽管未命名命名空间中的实体可能具有外部链接,但它们实际上是由其翻译单元唯一的名称限定的,因此在任何其他翻译单元中都看不到。
这意味着未命名命名空间中的函数funkcja
在定义全局函数funkcja
的转换单元中可见。这会导致在全局范围中定义两个相同名称的函数,从而导致重新定义错误。
如果funkcja
只存在于您的UnNamed Namespace中,则您可以通过::funkcja
调用它,因为它将在您的全局范围中。总之,可以根据UnNamed Namespace所在的范围调用UnNamed命名空间中的函数。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- C++:对不存在的命名空间使用命名空间指令
- C++ |匿名命名空间与命名空间 std 冲突
- C++未定义的命名空间
- 不同C++文件中未命名命名空间中的名称可以引用同一个命名事物吗?
- 命名空间中未引用的函数
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- 使用多个命名空间对 vtable 的未定义引用
- 正确编码和调试的命名空间中未解析的函数
- 在多个 cpp 文件中重用未命名的命名空间函数
- C++ ,错误:命名空间'std'中的'shared_ptr'未命名模板类型
- 在命名空间内的 lambda 中使用时未找到运算符重载
- 在联盟中,不愿命名的未命名结构的成员是错误或GCC错误
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- 使用其他命名空间内命名空间中的函数
- C :将外部链接与未命名的名称空间使用常数变量
- 正在使用未定义的嵌套 std 和 posix 命名空间
- 外部常量,未命名的命名空间
- C++命名空间未声明
- C++命名空间..匿名命名空间是合法的