【问题标题】:(Anonymous) Namespaces, Functions, and Header Files(匿名)命名空间、函数和头文件
【发布时间】:2016-11-01 13:21:01
【问题描述】:

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

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

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
}

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

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

【问题讨论】:

    标签: c++ function namespaces


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了,感谢您的快速回复。我想就是这样,但昨晚我分心了,没有机会检查。所以我想我会在工作的午休时间在这里问。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 2013-09-02
        • 2018-10-28
        相关资源
        最近更新 更多