头文件库中匿名命名空间的替代方案

3
我理解为什么在头文件中使用匿名命名空间是没有意义的......它们并不真正是匿名的......
然而,这引出了一个问题:是否有一种替代习惯/机制来避免在分发只有头文件的库时污染全局命名空间?
编辑:
我通常使用匿名命名空间将一些代码块限定在一个文件内部,以避免其污染全局命名空间。例如,如果某个类具有某些魔术常量,那么我可以在cpp文件中声明它,而不是声明一个全局静态int:
namespace{
    int magic = 5;
}

有没有一种方法可以在不使用cpp文件的情况下实现相同的效果?


它们并不真正匿名,你是不是把“私有”和“匿名”混淆了?一般来说,这些概念是相互独立的。 - 463035818_is_not_a_number
6
使用命名空间有什么问题? - user826955
一个匿名命名空间用于使东西具有内部链结(特别是那些你不能只声明为“static”的东西)。我不明白库仅作为头文件的意义与此有何关系。不过我可能误解了问题。 - StoryTeller - Unslander Monica
2
关于“begs the question”的用法 :) - P.W
1
嗯。每个TU都有自己的“魔法”定义,它们都不同。 - StoryTeller - Unslander Monica
显示剩余5条评论
2个回答

3

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

另外,如果您将foo_impl设置为名为detailfoo_private等的命名空间的成员,用户通常会理解他们不应该调用此函数。这在实践中效果很好。用户仍然可以自行决定访问该函数,但他们会了解到风险。这应该足够了,因为C++无法保护您免受恶意用户的攻击。


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

不打算供应用程序使用的函数位于 boost::math::detail 中。


但请注意,这只是一种惯例。 - Roger Lipscombe
@RogerLipscombe - 这在许多优秀的库和编程语言中都可以很好地运作。实际上,没有办法阻止一个足够有决心的程序员做他们不应该做的事情。 - StoryTeller - Unslander Monica
当然可以;我只是说它不像私有访问权限那样强。它更像是一个“勿入草坪”的标志,而不是一道围墙。 - Roger Lipscombe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接