在 .cpp 文件中,这两种方式有什么区别/偏好吗?
// file scope outside any namespace
using X::SomeClass;
typedef SomeClass::Buffer MyBuf;
v/s
namespace { // anonymous
using X::SomeClass;
typedef SomeClass::Buffer MyBuf;
}
在 .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++ 代码)。你能解释一下第二种技术背后的原因是什么吗?
您通常会在 C++ 实现文件中使用匿名命名空间来实现与“静态”在 C(或 C++,但我们将忽略)中所做的相同的事情,即限制符号对当前翻译单元的可见性. typedef 实际上并没有生成导出给链接器查看的符号,因为它们不会创建任何“具体”的东西,就您可以链接的任何具体而言。
我的推荐?我会用第一个符号。第二个增加了不必要的复杂性,在我看来,不会给你买任何东西。
将 typedef 放在匿名命名空间中没有多大意义。匿名命名空间的主要用途是通过在其中放置具有外部链接的定义来避免翻译单元之间的符号冲突。