namespace是什么?
在百度百科上是这样定义namespace的:namespace即“命名空间”,也称“名称空间” 。是许多编程语言使用的一种代码组织的形式,通过命名空间来分类,区别不同的代码功能,避免不同的代码片段(通常由不同的人协同工作或调用已有的代码片段)同时使用时由于不同代码间变量名相同而造成冲突。
命名空间分类
在c/c++中有很多的关键字如srand,assert,rand等还有我们在与别人写同一份项目时通常会遇到别人和你同用一个命名这时候就要用namespace了如
#include <iostream>
using namespace std;
namespace
{
int assert= 10;
}
int main()
{
cout << assert << endl;
return 0;
在namespace后面什么都不加就是面向全局的但是在namespace后面加入名称就是局部命名要标明位置如
同样是这段代码但是在namespace后面加入名称就是在oo这个局部变量中独有的与其他的数据保持独立
如这里的这段代码我只调用的oo这里的assert并没有调用pp里的显示的就是oo里的数据即是10,同理oo里面的asert与pp里的assert就是两个不同的数据避免了重复命名带来的报错
命名空间的使用
在命名空间中
- ::是域解析运算符
- using是声明符号
在不同的区域类中各个区域是相对独立的我们想用数据时就要将它标明出来::的用法如下
#include <iostream>
namespace oo
{
int a = 10;
}
int main()
{
std:: cout << oo::a << std::endl;
return 0;
}
需要将区域名称写在::之前但是每一次都要写就像是打开一个自动关闭的罐头每一次使用都要打开一次,这肯定是非常麻烦的这时就可以用using它就可以将“罐头”完全打开并把内容完全呈现
#include <iostream>
using namespace std;
namespace oo
{
int a = 10;
}
using namespace oo;
int main()
{
cout << a << endl;
return 0;
}
using就将std(Standard)和oo中的内容完全展示出来
存放函数,变量 ,结构体,类
namespace里是可以存放函数 变量 结构体 类的
#include <iostream>
using namespace std;
namespace
{
int add(int a, int b)
{
return a + b;
}
}
int main()
{
cout << add(1,3) << endl;
return 0;
}
如这段代码我在namespace中用了add这个函数可以正常调用,其它几个类似可以放心使用
命名空间的嵌套
命名空间可以嵌套使用但是要标好运行空间如
#include <iostream>
using namespace std;
namespace oo
{
namespace pp {
int add(int a, int b)
{
return a + b;
}
}
}
int main()
{
cout << oo::pp::add(1,3) << endl;
return 0;
}
这里的add便是oo局部空间中pp局部空间的add函数的调用
- using声明和using编译指令可以使用在全局,此时全局展开,也可在局部使用,此时仅仅在局部有用
命名空间的合并
在cpp中我们可能要用多个文件在这些文件中使用同一份命名空间这时候编译器会自动将命名空间合并但是得注意这得是在头文件或者是同一份文件的重复使用
在C++中,如果你尝试直接从一个.cpp文件访问另一个.cpp文件中定义的命名空间,并且没有通过头文件或其他机制来声明这些命名空间中的成员,那么编译器会报错,因为编译器在编译每个.cpp文件时是独立进行的,它不知道其他.cpp文件中发生了什么。
具体来说,如果你有两个.cpp文件,比如text.cpp和add.cpp,它们分别定义了自己的命名空间:
就会在编译过程(形成.o文件)中形成重定义正确的方法是在.h中定义
当然你是在同一文件中用的话可以百无禁忌