Pao*_*oni 11 c++ namespaces anonymous header-files
在C++中,匿名命名空间等同于:
namespace $$$$ {
//something
}
using namespace $$$$;
Run Code Online (Sandbox Code Playgroud)
其中$$$$是某种唯一标识符.然后,匿名命名空间对于不应在编译单元外看到的代码很有用.
到目前为止一直很好,但是最近我开始用模板编写一些代码,这样的代码必须在头文件中,因此使用匿名命名空间没有多大意义,因为仅仅包含头将使隔离效果无效.
那么问题是,在这种情况下建议的方式是什么?我开始使用名为Private的命名空间.它并没有真正阻止任何想要在里面使用标识符的人,但至少它将名称冲突减少为id"Private".
还有更好的方法吗?建议?
如果您迫切希望隔离,为什么不使用旧文件- static
呢?不建议使用:
template <typename T>
static void foo()
{}
int main()
{
foo<char>();
}
Run Code Online (Sandbox Code Playgroud)
再说一次,如果您只需要foo
一个翻译单元,那么大概只是将其包括在该翻译单元的标题中,那么无论它是否在标题中都没有关系。因此,只需不在其他翻译单元中包含模板即可,您已经在很大程度上实现了隔离的目标。
为了真正保证所有可能的实例化(即包括您在该TU中创建的实例化)的隔离,请static
按上述方式使用,或仅使用detail
名称空间记录您的意图。
坚持你的Private
namespace
(或使用更受欢迎的detail
)。请记住 C++ 访问机制背后的主要思想是使滥用它们变得困难,并非不可能。保护自己免受意外伤害,而不是恶意攻击。