1 作用域
1.1 命名空间(namespace)
在.cc中提倡使用匿名命名空间(unnamed namespace[i])。而定名命名空间(named namespace)的命名应该以项目及(如果不在根目录的话)项目中的路径来命名。不要使用using关键字。
定义:命名空间将作用域分割为相互独立的,具有特定名称的作用域。这样就可以避免在全局作用域中容易产生的同名冲突。
优点:在类提供的(有层次的)名称隔离方法基础上提供了另一套(有层次的)命名隔离方法[ii]。
例如,两个不同的工程中都含有全局类Foo,这两个类名可能在编译时或者运行时产生同名冲突。但是,如果在每个工程中都将他们放进相应的命名空间中,project1::Foo和project2::Foo就是两个完全不同的类名,而不会再产生同名冲突了。
劣势:命名空间容易让人感到迷惑,因为类本身已经提供了一套(有层次的)名称隔离方法,而命名空间在这个基础上又添加了一套(有层次的)名称隔离方法。
在头文件中使用匿名命名空间,很容易违反C++的单一定义规则(One Definition Rule[iii])。
结论:根据下述原则使用命名空间。
匿名命名空间
在.cc文件中,不仅允许使用匿名命名空间,并且,为了避免运行时同名冲突,还提倡使用匿名命名空间:
· 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
但是,文件内的与某个特定类相关的实体,应当在该类内声明为类型、静态成员或静态成员函数,而不是在类外声明为匿名命名空间的一个成员。如上例所示,在匿名空间的结尾处要添加注释“// namespace”。
在.h文件中不要使用匿名命名空间。
定名命名空间
定名命名空间用法如下:
除文件最前端的包含语句、gflags[iv]定义(声明)以及前置声明的别的命名空间中的类之外,命名空间包含整个源代码文件的内容:
· // In the .h file
· namespace mynamespace {
·
· // All declarations are within the namespace scope.
· // Notice the lack of indentation.
· class MyClass {
· public:
· ...
· void Foo();
· };
·
} // namespace mynamespace
// In the .cc file
na