作用域
名字空间(namespace)
在cpp源文件里面,经常鼓励使用匿名空间(Unnamed namespaces),或者使用项目名字或路径名字作为namespace。不要直接使用using (using-directive)。
(译者注: 匿名空间 Unnamed namespaces 后面有解释)
定义(Definition)
Namespaces 将全局作用域细分为不同的作用域,可有效防止命名冲突。
优点(pros)
Namespaces 提供了继承轴线,当然,类的名字也提供类似的功能。
举个例子来说,两个不同project中都有Foo类(在全局空间下),这样在编译或运行时期,就会冲突,不知道使用哪一个Foo才是想要的那个。如果每个project都使用一个自己的namespaceproject1::Foo
和 project2::Foo
。
这样就不会产生冲突,namespace把他们分成两个不同的类了。
(译者注:文章中说编译和运行期间,个人认为只会在编译期间产生冲突, 在编译时候 project1::Foo
和 project2::Foo
实际上被编译器把他们改成类似如
上两个不同的类, 编译期通过,运行期就没有任何问题)
缺点(cons)
不好理解,有时候第一眼看上去,很难区分是个域名还是一个类名,而且在头文件中使用匿名空间容易违背C++的ODR原则(One Definition Rule (ODR))
结论(Decision)
根据下面策略合理使用名字空间
匿名空间(Unnamed namespaces)
匿名空间是被允许甚至鼓励在cpp文件中使用,有效的防止名字冲突
namespace { // This is in a .cc file.
// The content of a namespace is not indented
enum { kUnused, kEOF, kError }; // Commonly used tokens.
bool AtEof() { return pos_ == kEOF; } // Uses our namespace's EOF.
} // namespace
匿名空间具有文件域相关性,即只有该文件内的代码才可以访问匿名文件中的类型和变量,其他文件是无法访问的.
(译者注: 一般说来,可以使用匿名空间代替static。如下面代码:
namespace {int a = 2;}
static int a = 3;
这两行代码所起的作用是一样,只有本文件中代码才能使用。
有聪明的同学问,可不可以2句话同时存在,那使用a变量的时候到底用哪一个呢。呵呵自己试一试吧,理解namespace和static区别
)
不要在头文件中使用匿名空间。(译者注:违反ORD原则)
有名空间(namespace)
有名空间应该如下使用