使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。 在多文件编译时,多个全局变量取名重复了,产生了命名冲突,这样的程序在C中,是无法通过编译的。如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了。
第一次见到的C++代码中,有一句:
using namespace std这就是对命名空间的使用,这里的std便是一个命名空间。
关键字:namespace
namespace 名称{//声明}
namespace N1 { int a; void Test() { } }在命名空间中定义的任何东西都局限于该命名空间内,即上例中,a和函数Test只在命名空间N1的作用域内有效。
::作用于限定符 例如要使用N1中的a
using namespace N1; N1::a = 10; using N1::a;在using的作用域内如果使用到N1中的成员a,则不必再用命名空间限定。在以后的程序中如果用到a,则隐含的指N1::a。 using声明的作用域是从using语句开始,到using所在的作用域结束。要注意,在同一作用域内用using声明的不同的命名空间的成员不能有同名的成员,否则会发生重定义。
命名空间可以进行嵌套,也可以命名
namespace N1 { int a; char c; namespace N2 { double d; } } namespace N1 = N3;其他文件无法引用没有名字的无名命名空间,它只在本文件的作用域内有效,从命名开始,到本文件结束为止。
无名命名空间是外部链接 static是内部链接 在声明无名命名空间时,系统为其分配了一个名字。 二者都是无法被其他文件引用。
static:内部链接,定义的变量只能在此变量的文件中使用 extern:外部链接,已经定义一个变量,但不在当前编译单元内
C++库的所有标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(iostream)中的函数、类、对象和类模板是在命名空间std中定义的。所以在C++程序的一开始,就用using namespace对std进行全局声明。