【问题标题】:Typedef inside/outside anonymous namespace?Typedef 内部/外部匿名命名空间?
【发布时间】:2009-12-05 14:22:00
【问题描述】:

在 .cpp 文件中,两种方式有什么区别/偏好吗?

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

v/s

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

【问题讨论】:

    标签: c++ namespaces typedef using directive


    【解决方案1】:

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

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

    我的建议?我会用第一个符号。第二个增加了不必要的复杂性,在我看来,不会给您带来任何好处。

    【讨论】:

    • 说到使用 namespace {} 而不是 static 对我来说似乎是一种 hack,我从不喜欢或使用它。如果他们担心静态的 900 万种不同用途,他们应该引入一个新关键字。..
    • 奇怪的是,我确实更喜欢匿名命名空间而不是静态命名空间,尽管我已经完成了我相当一部分的 C 编程。正是静态的 900 万次使用和计数使我使用匿名命名空间。另外,我发现它更简洁一些,与忘记在某些东西前面加上“静态”相比,它更难搞砸。
    • 我曾经在匿名命名空间中有一堆调试的东西,现在已经不复存在了。剩下的唯一有用的东西是 typedef 和 using,所以我在争论是否将它们移动到文件范围和垃圾匿名命名空间。
    • 如果这是全部内容,我会将其移至文件范围,除非存在破坏某些内容的危险(例如,如果您在多个命名空间中有 SomeClass)。恕我直言,它会使代码更清晰,并删除一些说什么?六个月后你回到它的时刻。
    【解决方案2】:

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

    【讨论】:

    • 嗯,我认为匿名命名空间具有整个文件内容的范围,包括文件中的其他命名空间,这将使其与将内容放在文件范围内相同(外部链接规则除外)。我不确定外部链接规则是否与 typedef 和 using 等语法糖相关。
    • 你是对的,是否将 using 声明放在匿名命名空间中并不会改变任何内容。我错了。我已经编辑了这个。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 2012-06-05
    • 2018-09-10
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多