首先明晰一下要使用名子空间的目的是为了避免名子冲突。
一、访问名子空间中元素的3种形式:
1、可以自己去定义一些名子空间:
namespace NameSpace1
{
void fun()
{
}//该fun函数是属于名字空间NameSpace1的。
int x=0;//是NameSpace1里边所包含的变量。
}
namespace NameSpace
{
void fun()
{
}//该fun函数是属于名字空间NameSpace2的。
}
2、自定义名子空间的使用:使用域解析符来调用
#include
namespace NameSpace1
{
void fun()
{
}//该fun函数是属于名字空间NameSpace1的。
}
namespace NameSpace
{
void fun()
{
}//该fun函数是属于名字空间NameSpace2的。
}
void fun()
{
}//该fun函数是属于全局的
int main()
{
//使用域解析符来调用
NameSpace1::fun();//我调用的是NameSpace1中的fun函数。
NameSpace2::x;//使用x。
NameSpace2::fun();//我调用的是NameSpace1中的fun函数。
}
3、自定义名子空间的使用:使用using句子来调用
#include
namespace NameSpace1
{
void fun()
{
}//该fun函数是属于名字空间NameSpace1的。
}
namespace NameSpace
{
void fun()
{
}//该fun函数是属于名字空间NameSpace2的。
}
void fun()
{
}//该fun函数是属于全局的
int main()
{
//使用using语句来调用
using namespace NameSpace1;
//这样子来写之后对于main函数内部里边他既能够看到全局名字空间里边所有的函数,又能够看到NameSpace1里边所有的函数
fun();//此时调用fun()函数,系统会自动分析说首先在全局名字空间里边查找没有fun()这个函数,这个时候因为使用的是using namespace NameSpace1这个时候他就会在using namespace NameSpace1里边查找fun就可以使用了。
}
4、自定义名子空间的使用:使用名子空间别称
#include
namespace NameSpace1
{
void fun()
{
}//该fun函数是属于名字空间NameSpace1的。
}
namespace NameSpace
{
void fun()
{
}//该fun函数是属于名字空间NameSpace2的。
}
void fun()
{
}//该fun函数是属于全局的
int main()
{
namespace ns1=NameSpace1;//相当于对NameSpace1这个长的名字,赋予一个简短的别名ns1;一个昵称。
ns1::fun();//这样就是使用的是NameSpace1中的fun函数。
}
注意:如果把using namespace NameSpace1置于函数外边,
#include
namespace NameSpace1
{
void fun()
{
}//该fun函数是属于名字空间NameSpace1的。
}
namespace NameSpace
{
void fun()
{
}//该fun函数是属于名字空间NameSpace2的。
}
void fun()
{
}//该fun函数是属于全局的
using namespace NameSpace1;//如果把它放在main函数外边,那么接下来我们所有的代码再去使用的时候,他都会去从全局名字空间和NameSpace1里边去查找;//PS:但是这种方式实际上是不推荐的,这样的话实际上将NameSpace1里边所有的内容都暴露给下边了,那么同样的我们会引入名字冲突,就无法起到避免名字冲突的作用。比如如果我们在一个头文件中去这样使用的话,是非常危险的,相当于所有通过include引用这个头文件的源文件都会存在名字冲突的潜在的可能性,因为我们NameSpace1里边定义的东西和全局名字里边定义的东西都可见。这个时候更容易引起冲突。
int main()
{
fun();//这样就会引起冲突,因为不知道你是使用的全局名字里边的fun函数,还是使用的是NameSpace1中的fun函数。
}
总结:最安全的使用方式就是使用::,这样不会出现冲突。
二:std名子空间
std是C++标准库所定义的名子空间,std上面所包含的都是C++标准库上面所包含的东西。
三、名字空间与名称改编(name mangling)
我们的整个程序在编译完了以后,会编译出.o文件,.o文件以后会进行链接,链接成可执行文件;(链接是一个连接器把各个的目标文件和源文件给他链接上去)