2.1. 命名空间
这段文字的关键内容概括如下:
1. 命名空间的使用:除了少数特殊情况外,代码应在命名空间内,命名空间名称应唯一,包含项目名和可选的文件路径。
2. 禁止使用:
- `using` 指令引入整个命名空间。
- 内联命名空间。
3. 命名空间定义:命名空间用于划分全局作用域,防止命名冲突。
4. 优点:避免大型程序中的命名冲突,允许使用简短名称。
举例来说, 若两个项目的全局作用域中都有一个叫 Foo
的类 (class), 这两个符号 (symbol) 会在编译或运行时发生冲突. 如果每个项目在不同的命名空间中放置代码, project1::Foo
和 project2::Foo
就是截然不同的符号, 不会冲突.
内联命名空间会自动把其中的标识符置入外层作用域, 比如:
namespace outer { inline namespace inner { void foo(); } // namespace inner } // namespace outer
此时表达式 outer::inner::foo()
与 outer::foo()
等效.
5. 缺点:
- 难以理解,难以找到标识符的定义。
- 内联命名空间更难理解,标识符出现在多个作用域。
6. 使用建议:
- 遵守命名空间命名规则。
- 在文件末尾注释命名空间名称。
- 在导入语句后,用命名空间包裹整个源代码文件。
7. 复杂文件处理:更复杂的 `.cc` 文件可能包含旗标、`using` 声明等,在命名空间内处理。
8. Proto 消息命名空间:使用 `package` 修饰符将自动生成的 proto 消息代码放入命名空间。
9. std 命名空间:不在 `std` 命名空间内声明任何东西,不前向声明标准库类。
10. using 指令:禁止使用 using 指令 引入命名空间的所有符号。
/ 禁止: 这会污染命名空间. using namespace foo;
11. 命名空间别名:可以在内部使用的命名空间内使用别名,不在头文件中引入别名作为公开 API。
12. 内部命名空间:如果命名空间名称包含 "internal",则不应由用户使用这些 API。
13. 单行嵌套命名空间声明:鼓励使用,但不强制。
例如
namespace foo::bar { ... } // namespace foo::bar