未命名的命名空间

Unnamed namespace

本文关键字:命名空间 未命名      更新时间:2023-10-16

有以下代码:

#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命名空间中的函数。