一、定义
a)C++中namespace,是指标识符的各种可见范围,为了在namespace外使用namespace内的变量我们使用::操作符,如下
exp::a
exp::b
使用namespace可以有效的避免重定义的问题。
eg:#include <iostream>
using namespace std;
namespace first
{
int var = 5;
}
namespace second
{
double var = 3.1416;
}
int main () {
cout << first::var << endl;
cout << second::var << endl;
return 0;
}
结果是
5
3.1416 //两个全局变量都是名字都是var,但是他们不在同一个namespace中所以没有冲突。
b)C++标准程序库中的所有标识符都被定义在一个名字叫std的namespace中,所以使用C++标准程序库中函数的方法有三种:
1)使用using namespace,然后就可以调用。
eg:#include <iostream>
using namespace std;
void main()
{
double a = 2.0,b = 3.1415;
cout<<a<<b<<endl;
}
2)使用using +具体namespace中函数
eg:#include <iostream>
using std::cout;
using std::endl;
void main()
{
cout<<std::hex<<3.4<<endl;
}
3)直接指定标识符。
eg:#include <iostream>
void main()
{
std::cout<<std::hex<<3.4<<std::endl;
}
二、区别于之前标准程序库
早期的实现将标准库定义在全局空间里,声明在.h为后缀的头文件中。
后缀为.h的头文件,C++标准已经明确提出不支持了,
三、注意事项:
a)namespace支持嵌套
eg://test1.h
#include <iostream>
namespace first
{
int a=10;
namespace second
{
double a=1.28;
void show();
}
void second::show()
{
std::cout <<"It is a test"<<std::endl;
}
}
//test1.cpp
#include"test1.h"
int main()
{
using namespace first;
std::cout<<second::a<<std::endl;
second::show();
}输出结果:1.28
It is a test
b)在头文件中,使用显式的限定,并且仅将using指令局限在很小的作用域中,这样他们的作用范围就会受到限制并且易于使用。
eg://test2.h
#include <iostream>
using namespace std;
namespace first
{
int a = 10;
}
namespace second
{
double a= 3.1415;
}
//test2.cpp
#include"test2.h"
int main()
{
{
using namespace first;
cout << a << endl;
}
{
using namespace second;
cout << a<< endl;
}
return 0;
}输出结果:
10
3.1415