一文搞懂
C++
中的
namespace
C++
中的
namespace
1 namespace
的作用
创建名字是程序设计过程中一项最基本的活动,比如创建符号常量、变量、函数、结构、枚举、类和对象等名字。当一个项目很大时,名字互相冲突性的可能性越大,因此在调用的时候就会出现一系列的问题。
为了避免这种情况发生所带来的后果,标准 C++
引入关键字 namespace
(命名空间/名字空间/名称空间),对标识符的作用域进行控制。正如 C
语言可以通过 static
关键字来使得名字只得在本编译单元内可见。
2 namespace
的用法
2.1 定义 namespace
namespace
的定义使用关键字 namespace
,后跟命名空间的名称,如下所示:
namespace namespace_name {
// 代码声明
}
当对 namespace
的函数或变量进行调用时,需要在前面加上命名空间的名称,如下所示:
name::code; // code 可以是变量或函数
注意事项:
namespace
只能全局范围内定义(以下错误写法)
void test() {
namespace A{
int a = 10;
}
namespace B{
int a = 20;
}
cout << "A::a : " << A::a << endl;
cout << "B::a : " << B::a << endl;
}
namespace
可进行嵌套
namespace A {
int a = 10;
namespace B {
int a = 20;
}
}
namespace
是开放的,随时可以把新的成员加入已有的 namespace
中
namespace A {
int a = 10;
}
namespace A {
void func() {
cout << "hello namespace!" << endl;
}
}
namespace
的声明和实现可分离
namespace NewSpace {
void func1();
void func2(int param);
}
void NewSpace::func1(){
cout << "NewSpace::func1" << endl;
}
定义无名的 namespace
,意味着 namespace
中的标识符只能在本文件内访问,相当于给这个标识符加上了 static
,使得其可以作为内部连接
namespace {
int a = 10;
void func() {
cout << "hello namespace" << endl;
}
}
void test() {
cout << "a : " << a << endl;
func();
}
可对已定义的 namespace
定义别名
namespace veryLongName {
int a = 10;
void func() {
cout << "hello namespace" << endl;
}
}
void test() {
namespace shortName = veryLongName;
cout << "veryLongName::a : " << shortName::a << endl;
veryLongName::func();
shortName::func();
}
2.2 使用 namespace
使用 using
关键字加上需要使用的命名空间的名称,就可以告诉编译器后续的代码将使用指定的命名空间。
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
void test ()
{
// 调用第一个命名空间中的函数
func();
}