在匿名命名空间内/外的Typedef?

时间:2009-12-05 14:22:01

标签: c++ namespaces typedef using directive

在.cpp文件中,是否有任何差异/偏好?

// file scope outside any namespace
using X::SomeClass;
typedef SomeClass::Buffer MyBuf;

V / S

namespace { // anonymous
  using X::SomeClass;
  typedef SomeClass::Buffer MyBuf;
}

2 个答案:

答案 0 :(得分:7)

我会说第二种用法是相当不常见的,至少在我到目前为止看到的代码中(我已经看到了很多C ++代码)。你能解释第二种技术背后的原因是什么吗?

您通常会在C ++实现文件中使用匿名命名空间来实现“静态”在C(或C ++中)中所做的相同的事情,但我们会掩饰它,即将符号的可见性限制为现翻译单位。 typedef实际上并不会生成为链接器导出的符号,因为它们不会在您可以链接的任何具体内容中创建任何“具体”。

我的推荐?我会用第一个符号。第二个增加了不必要的复杂性,在我看来,不会给你买任何东西。

答案 1 :(得分:5)

将typedef放在匿名命名空间中没有多大意义。匿名命名空间的主要用途是通过在其中放置带有外部链接的定义来避免转换单元之间的符号冲突。