C++的名字空间
名字空间主要用于解决名字冲突的问题,应用程序可能会调用多个库程序,不同的库程序可能会存在相同
的全局变量名,全局函数名,类名等。库程序的作者为了避免其他程序中名字或者用户自己定义的名字冲突,
将库程序中的所有名字放在一个特定的名字空间下。这样一个标识符可以在不同的名字空间使用,提高标识
符的利用率。
一、名字空间的引入
namespace 空间名{
成员;
}
二、名字空间的用法
前缀用法: 空间名::成员 <==> spaceName::member
后缀用法: using namespace 空间名;
c成员变量的引用;
例如:
namespace A{
int a = 10;
}/*定义一个名字空间A,有一个成员变量a*/
/*此时如果想要引用成员变量a有两种方式*/
前缀用法:printf("%d\n", A::a);
后缀用法:using namespace A;
printf("%d\n", a);
三、名字空间的分类
1、自定义名字空间
如果自己编写库程序并且用自己定义的名字空间,则无论是在.cpp的源程序中编写库函数还是在.h的头文
件中对库函数进行声明,则都需要在指定的名字空间下进行。
用法:
namespace 名字空间{
名字空间的定义或者声明;
}
例如:
"mylib.cpp"文件
#include <iostream>
using namespace std;
namespace WH{
void f(){
cout << "WH::f()" << endl;
}
void g(){
cout << "WH::g()" << endl;
}
}//在名字空间中定义函数
"mylib.h"文件
#ifndef _MYLIB_H_
#define _MYLIB_H_
namespace WH{
void f();
void g();
}
#endif
//在名字空间中声明函数
2、无名名字空间
如果定义某个名字时,没有纳入某个指定的名字空间,则默认放在无名名字空间下。
using namespace std;
#include <iostream>
#include "mylib.h"
using namespace WH;//自定义名字空间的using名字声明
void f(){
cout << "::f()" << endl;
}//全局函数,无名名字空间定义的函数
int main()
{
::f();//调用无名名字空间的f()函数
WH::f();//调用WH名字空间的函数
//f();//错误用法,有冲突。
g();//调用名字空间WH下的函数,此处对名字空间进行了声明,而且没有名字冲突。
return 0;
}
四、名字空间的嵌套
#include <cstdio>
#include <cstdlib>
namespace A{
int a = 10;
namespace B{
int b = 20;
}
}
using namespace A;
using namespace B;
int main()
{
printf("%d\n", A::B::b);
printf("%d\n", B::b);
printf("%d\n", b);
return 0;
}