仅标头库中匿名名称空间的替代方法

时间:2019-02-13 09:09:06

标签: c++

我了解为什么在头文件中使用匿名名称空间没有意义...它们并不是真正的匿名...

但是,这引出了一个问题:

在分发仅标头的库时,是否还有其他惯用语/机制来避免污染全局名称空间?

编辑:

我对匿名名称空间的典型用法是在文件本地保留一些代码块,以免污染全局名称空间。例如如果某个类具有一些魔术常数,则可以在cpp文件中声明它,而不是声明一个全局静态int:

namespace{
    int magic = 5;
}

是否有一种无需使用cpp文件即可达到相同效果的方法?

2 个答案:

答案 0 :(得分:2)

boost中,有时使用名为detail的命名空间

  

不适用于应用程序的功能在boost::math::detail中。

答案 1 :(得分:2)

C ++没有任何机制可以使头文件中的实体对用户完全不可见。如果需要,可以将它们设置为不可访问。通常,这是通过成员访问控制来实现的。您必须使foo_impl成为某个类的私有(可能是静态)成员。 foo的重载将成为同一个类的成员或朋友。

或者,如果您将foo_impl命名为detailfoo_private的命名空间的成员,则用户通常会理解他们不应称呼此名称功能。这在实践中效果很好。用户仍然可以自行承担访问该功能的风险,但他们会理解该风险。这应该足够了,因为C ++仍然无法保护您免受恶意用户的侵害。