定义
有时候为了方便管理,将函数,变量等附加到一个命名空间里面
namespace N
{
int value1;
int value2;
}
//访问:
N::value=200;
using N::value2;
value2=100;
知识扩展*:使用using namespace N这种方式,用了这种方式,就相当于引入了N里面所有的关键字,可能会引起重名的麻烦,也可以使用using方式进行访问,这样下次访问时就不用加命名空间了
特别注意*:命名空间不能写在函数体里面
std::cout
这里std就是一个命名空间
知识扩展*:如果不想加std在前面,可以先声明 using std::cout,这样以后再调用cout就不用在前面加上std了,也可以直接声明using namspace std,不过不推荐这种用法
全局命名空间
所有具有链接属性的对象,只要没有定义命名空间,就默认在全局命名空间里,全局命名空间里成员访问不用显示指定,当局部变量覆盖了全局变量才需要指定,通过两个::访问全局命名空间对象
const int value{0};
int main()
{
int value{1};
std::cout<<::value;
}
这里输出为0
命名空间的扩展
namespace N
{
int value0;
}
//对N进行扩展
namespace N
{
int value01;
}
在N中添加成员如上所示
命名空间内的声明和定义
namespace N
{
extern int value02;//仅声明变量
void test();//仅声明函数
}
定义的第一种写法:
namespace N
{
value02 {4 };
test()
{
}
}
定义的第二种写法
int N::value02 {5};
int N::test(){};
命名空间的嵌套
namespace N
{
namespace M
{
int value01{0};
}
}
它的使用
M::N::value01 {5};
命名空间的别名
给上面的代码起别名
namespace a=M::N
a::value01 {6} //调用N里面的变量
未命名命名空间
a.cpp中
namespace
{
void Test()
{
}
}
b.cpp中
namespace
{
void Test()
{
std::cout<<"1";
}
}
运行后,两个test互不干扰,因为未命名空间里面的内容一律为内部链接属性,包括extern声明的内容,未命名空间里的内容仅仅在本转换单元内有效