(匿名)命名空间、函数和头文件

(Anonymous) Namespaces, Functions, and Header Files

本文关键字:文件 函数 匿名 命名空间      更新时间:2023-10-16

不确定以前是否有人问过这个问题。我四处寻找,找不到我的场景的确切答案,但我可能错过了它。

问题:我在头文件中有一个命名空间,并且在头文件的命名空间中有一些函数原型:

namespace Foo{
    void SomeFunc();
    void SomeOtherFunc(int);
}

在.cpp文件中,我想在命名空间中定义函数,同时也为它们都依赖的随机数生成器提供一些保护,使用匿名命名空间:

namespace Foo{
    namespace{
        RNG rando = new RNG();
    }
    void SomeFunc(){
        //implementation
    }
    void SomeOtherFunc(){
        //implementation
    }
}

我遇到的问题是,不能保证头文件中的原型与我在cpp文件中定义的函数相匹配。命名空间{}代码块中的所有内容都可以只是添加到命名空间中的新内容。

在上面的代码示例中,SomeOtherFunc()是在没有int类型参数的情况下实现的,但是它的声明说它需要一些参数。实际上,我似乎重载了SomeOtherFunc()签名。

我可以在cpp文件中使用以下命令:

namespace Foo{
    namespace{
        RNG rando = new RNG();
    }
}
void Foo::SomeFunc(){
    //implementation
}
void Foo::SomeOtherFunc(int){
    //implementation
}

编译器似乎强制函数的声明和实现之间的关系,我喜欢。但是,这些函数似乎无法访问匿名命名空间中的数据。

我错过了什么吗?我能做些什么来解决我觉得在这个实现中存在的问题吗?我不是很精通使用(匿名)名称空间,所以如果这看起来很基础,我很抱歉。

将未命名的命名空间移出另一个命名空间:

namespace{
    RNG rando = new RNG();
}
void Foo::SomeFunc(){
    //implementation
}
void Foo::SomeOtherFunc(int){
    //implementation
}

无论如何都不能在翻译单元之外访问

据我所知,通常的约定是在.cpp文件的开头声明匿名命名空间。在您的示例中,您的cpp文件应该如下所示:

namespace{
   RNG rando = new RNG();
}
void Foo::SomeFunc(){
    //implementation
}
void Foo::SomeOtherFunc(int){
    //implementation
}

匿名命名空间是一个转移注意力的东西。你可以忽略它,它实际上是一个实现细节。

是的,你可以在.cpp文件的头文件中重载一个函数。但是,如果您尝试使用pair中未定义的那一半,则会得到链接器错误。