当程序达到一定的规模之后,通常分成许多块,每一块由不同的人或小组来构造和连接。由于所有的函数名和标识符都在同一程序里,这就要求所有的开发人员都必须非常小心,不要碰巧使用了相同的函数名和变量,导致冲突。
标准的 C ++有预防这种冲突的机制 namespace 关键字。库或程序中的每一个 C ++定义集被封装在一个命名空间中,如果其他的定义中有相同的名字,但它们在不同的命名空间,就不会产生冲突。
举一个例子:假如A和B起参加了一个系统开发项目,他们都定义了一个全局变量P用来打开文件,这时要把这个项目的代码整合在一起编译运行,那么编译器会提示变量P重复定义错误,它不清楚该执行哪一个变量P,如果A和B分别编写这样的代码:
namespace A
{FILE P=NULL;}
namespace B
A和B各自定义了以自己名字的命名空间,再把代码整合在一起编译就不会出现问题。
我们从这个例子中可以看出定义一个命名空间的语法格式:
Namespace 名称
{变量、函数、类型等}
以上面的变量P为例,在使用变量P时,我们就要指明它所在的命名空间:
A::P=fopen(“XX.txt”,”k1”);//使用A定义的变量P
B::P=fopen(“XXX.txt”,”k2”);//使用B定义的变量P
这里的::是域解析操作符,指明要使用的命名空间。在写程序之前,如果仅仅只包含头文件,编译器无法找到任何有关函数和对象的声明。因为没有告诉编译器我们想要用这个命名空间中的声明。解决这一问题可以用一个关键字来声明:“我要使用这个命名空间中的声明和(或)定义”。这个关键字是“ using ”。用using关键字来声明,如:
using A::p;
P=fopen(“XX.txt”,”k1”);
using声明以后的程序中如果出现了未指明命名空间的P,就使用A::p,但如果要使用B定义的P打开文件,那么需要写B::P=fopen(“XXX.txt”,”k2”);
using不仅可以声明一个变量,也可以声明整个命名空间,如:
using namespace A;
P=fopen(“XX.txt”,”k1”);
又如:using namespace std;
std就是standard,所有的标准C++库都封装在这个命名空间中,加上这条语句:using namespace std ;
这意味着打开 std 命名空间。有了这条语句,就不用担心特殊的库组件是在一个命名空间中,因为在使用 using 指令的地方,它使命名空间在整个文件中都是可自用的。这里有解释了为什么我们每次写程序时都会加上这条语句。
接上一个例子,如果命名空间A中还有其它的变量或函数,那么同样具有变量A的效果,using声明以后的程序中如果有未具体指定命名空间的变量或函数产生了命名冲突,那么默认采用命名空间A中的变量或函数,但如果要使用B定义的P打开文件,那么仍然需要写
B::P=fopen(“XXX.txt”,”k2”);
因为语句using namespace A;只是把命名空间A申明了,并没有声明命名空间B,B需要另外声明。
留言与评论(共有 0 条评论) “” |