如果我在标题中需要匿名命名空间怎么办?

Pao*_*oni 11 c++ namespaces anonymous header-files

在C++中,匿名命名空间等同于:

namespace $$$$ {
  //something
}
using namespace $$$$;
Run Code Online (Sandbox Code Playgroud)

其中$$$$是某种唯一标识符.然后,匿名命名空间对于不应在编译单元外看到的代码很有用.

到目前为止一直很好,但是最近我开始用模板编写一些代码,这样的代码必须在头文件中,因此使用匿名命名空间没有多大意义,因为仅仅包含头将使隔离效果无效.

那么问题是,在这种情况下建议的方式是什么?我开始使用名为Private的命名空间.它并没有真正阻止任何想要在里面使用标识符的人,但至少它将名称冲突减少为id"Private".

还有更好的方法吗?建议?

Lig*_*ica 5

如果您迫切希望隔离,为什么不使用旧文件- static呢?不建议使用:

template <typename T>
static void foo()
{}

int main()
{
    foo<char>();
}
Run Code Online (Sandbox Code Playgroud)

再说一次,如果您只需要foo一个翻译单元,那么大概只是将其包括在该翻译单元的标题中,那么无论它是否在标题中都没有关系。因此,只需不在其他翻译单元中包含模板即可,您已经在很大程度上实现了隔离的目标。

为了真正保证所有可能的实例化(即包括您在该TU中创建的实例化)的隔离,请static按上述方式使用,或仅使用detail名称空间记录您的意图。


Pau*_*ans 5

坚持你的Private namespace(或使用更受欢迎的detail)。请记住 C++ 访问机制背后的主要思想是使滥用它们变得困难,并非不可能。保护自己免受意外伤害,而不是恶意攻击。