介绍
一般情况下,如果c++中出现两个变量、函数名、类名完全相同时,就会产生冲突。解决命名冲突的办法传统的做法是重新使用不同的标识符。但又是这样做有时反而降低程序的可读性,因此c++提供了第二种解决命名冲突的方法——命名空间。将这些名字相同的变量、函数和类定义在不同的命名空间中,问题就解决了。需要注意的是,同一个命名空间中标识符须是唯一的。
例如:XX和YY都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,编译器会提示 fp 重复定义( Redefinition)错误。为了解决合作开发时的命名冲突问题, C++ 引入了命名空间( Namespace) 的概念。
格式
定义格式:
namespace 命名空间标识符名
{}
例子
在 main() 函数中声明命名空间 std,它的作用范围就位于 main() 函数内部,如果在其他函数中又用到了 std,就需要重新声明,请看下面的例子:
namespace XX{ //XX的变量定义FILE fp = NULL;
}
namespace YY{ /YY的变量定义FILE fp = NULL
}
使用变量、函数时要指明它们所在的命名空间。以上面的 fp 变量为例,可以这样来使用:
XX::fp = fopen("X_read.txt", "r"); //使用XX定义的变量 fp
YY::fp = fopen("Y_read.txt", "rb+"); //使用YY定义的变量 fp
注意:::称为域解析操作符,在 C++中用来指明要使用的命名空间。
除了直接使用域解析操作符,还可以采用 using 关键字声明:
#include <iostream>void func()
{//必须重新声明using namespace std; cout<<"this is test fun"<<endl;
}int main()
{//声明命名空间 stdusing namespace std; cout<<"this is test"<<endl;func(); return 0;
}
大多数代码中将 std 直接声明在所有函数外部,这样虽然使用方便,但在中大型项目开发中是不被推荐的,这样做增加了命名冲突的风险,这里推荐在函数内部声明 std。