我了解为什么在头文件中使用匿名名称空间没有意义...它们并不是真正的匿名...
但是,这引出了一个问题:
在分发仅标头的库时,是否还有其他惯用语/机制来避免污染全局名称空间?
编辑:
我对匿名名称空间的典型用法是在文件本地保留一些代码块,以免污染全局名称空间。例如如果某个类具有一些魔术常数,则可以在cpp文件中声明它,而不是声明一个全局静态int:
namespace{
int magic = 5;
}
是否有一种无需使用cpp文件即可达到相同效果的方法?
答案 0 :(得分:2)
在boost中,有时使用名为detail
的命名空间
不适用于应用程序的功能在
boost::math::detail
中。
答案 1 :(得分:2)
C ++没有任何机制可以使头文件中的实体对用户完全不可见。如果需要,可以将它们设置为不可访问。通常,这是通过成员访问控制来实现的。您必须使foo_impl
成为某个类的私有(可能是静态)成员。 foo
的重载将成为同一个类的成员或朋友。
或者,如果您将foo_impl
命名为detail
或foo_private
的命名空间的成员,则用户通常会理解他们不应称呼此名称功能。这在实践中效果很好。用户仍然可以自行承担访问该功能的风险,但他们会理解该风险。这应该足够了,因为C ++仍然无法保护您免受恶意用户的侵害。