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

时间:2016-06-29 17:21:03

标签: c++ function namespaces

不确定此问题是否曾被提出过。我四处搜索,找不到我的方案的确切答案,但我可能错过了它。

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

namespace Foo{

    namespace{
        RNG rando = new RNG();
    }

    void SomeFunc(){
        //implementation
    }

    void SomeOtherFunc(){
        //implementation
    }
}

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

namespace Foo{

    namespace{
        RNG rando = new RNG();
    }

}
void Foo::SomeFunc(){
    //implementation
}

void Foo::SomeOtherFunc(int){
    //implementation
}

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

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

我可以在cpp文件中使用以下内容:

{{1}}

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

我在这里遗漏了什么吗?我能做些什么来解决我认为在这个实现中存在的问题?我不是很精通使用(匿名)命名空间,所以如果这看起来很基本,我会道歉。

3 个答案:

答案 0 :(得分:3)

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

namespace{
    RNG rando = new RNG();
}

void Foo::SomeFunc(){
    //implementation
}

void Foo::SomeOtherFunc(int){
    //implementation
}

无论如何都无法在翻译单元外访问。

答案 1 :(得分:2)

通常的惯例是,据我所知,在.cpp文件的开头声明匿名命名空间。在您的情况下,您的cpp文件应如下所示。

namespace{
   RNG rando = new RNG();
}

void Foo::SomeFunc(){
    //implementation
}

void Foo::SomeOtherFunc(int){
    //implementation
}

这样,函数应该可以访问rando。

答案 2 :(得分:0)

匿名命名空间是一个红色的鲱鱼。你可以忽略它,字面上一个实现细节。

是的,您可以从.cpp文件中的标头重载函数。但是,如果您尝试使用该对中未定义的一半,则会出现链接器错误。