【C++】命名空间
C++ 命名空间(namespace)
C++ 命名空间
- C++ 命名空间(namespace)
- 1. 定义命名空间
- 2. using 指令
- 3. 命名空间的分布
- 4. 匿名命名空间
为了解决源文件中变量,函数重名的问题(作用域冲突问题),引入了命名空间(namespace)。
1. 定义命名空间
命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:
namespace name { // 函数,变量}
在{ }
中可以定义变量和函数,
为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示:
name::code; // code 可以是变量或函数
2. using 指令
您可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。
常见的 cpp hello world例子如下:
#include <iostream>
using namespace std;int main(void)
{cout << "hello world!" << endl; return 0;
}
using 指令也可以用来指定命名空间中的特定项目,例如只对 std::cout 生效,其他的不生效。
比如直接指定:using std::cout
使用命名空间std下的cout函数,示例如下:
#include <iostream>
using std::cout;int main(void)
{cout << "hello world!" << std::endl; return 0;
}
using 指令引入的名称遵循正常的代码范围规则,名称从使用 using 指令开始是可见的,直到该代码段范围结束。
3. 命名空间的分布
命名空间是由几个单独定义的部分组成的,因此同一个命名空间可以分散定义在几个不同的源文件中。
4. 匿名命名空间
C++中把**namespace { … }
没有名字的写法叫 匿名命名空间(anonymous namespace),它的作用是把其中声明的符号限定为“本编译单元内可见”,和 static 的作用一样,但是比 static 简洁。
作用与特点
- 内部链接(Internal linkage)
- 匿名命名空间里的函数、变量、类 只能在当前
.cpp
文件里访问。 - 编译器会自动生成一个唯一的、不可见的名字,避免与别的文件冲突。
- 和在全局作用域写
static
的效果类似,但更现代化、语义更清晰。
- 匿名命名空间里的函数、变量、类 只能在当前
- 封装实现细节
- 很适合放只在本文件使用的工具函数、常量、全局对象,防止被其他文件
extern
引用。 - 在大型工程或库里,可以避免命名污染。
- 很适合放只在本文件使用的工具函数、常量、全局对象,防止被其他文件
- 与普通
namespace foo {}
的区别- 普通命名空间可跨文件访问,需要写
foo::func();
- 匿名命名空间无法在别处用名字引用,因为它没有名字。
- 普通命名空间可跨文件访问,需要写