2009-12-05 87 views
6

在.cpp文件中,是否有任何区别/偏好?匿名命名空间内部/外部的Typedef?

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

V/S

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

回答

5

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

+0

嗯我以为匿名命名空间的范围已经覆盖整个文件内容,包括文件中的其他命名空间,这将使得它无论如何都将文件放在文件范围内(除了外部链接规则)。我不确定外部链接规则是否与类型定义和使用等语法糖相关。 – Jay 2009-12-05 16:18:41

+0

你说得对,将使用声明放在匿名命名空间中或不会改变任何内容。我误解了。我编辑了这个。 – Thomas 2009-12-05 16:37:03

7

我会说第二种用法很少见,至少在我目前看到的代码中(我已经看到很多C++代码)。你能解释第二种技术背后的推理是什么吗?

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

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

+0

说到使用命名空间{}而不是静态对我来说似乎是一种破解,我从来不喜欢或使用它。如果他们担心静态的900万不同用途,他们应该引入一个新的关键字.. – 2009-12-05 14:51:15

+2

奇怪的是,我更喜欢匿名命名空间,而不是静态的,即使我已经完成了C编程的公平份额。正是这9百万次使用和静态计数让我使用匿名命名空间。另外,我发现它更简洁一些,与忘记用'静态'前缀相比,这很难搞砸了。 – 2009-12-05 15:01:56

+0

我以前在匿名命名空间里有一堆调试的东西,现在已经不存在了。剩下的唯一有用的东西是typedefs和using,所以我在辩论是否将它们移动到文件范围并垃圾匿名命名空间。 – Jay 2009-12-05 16:13:52

相关问题