命名空间
为什么提出命名空间,因为c语言在使用过程中如果涉及到多公司,多部门,多小组进行协作开发时,很容易差生问题:命名冲突
如果都相同的情况下,当合并代码时,就会碰到bug
C语言解决方案:
//做约定 公司名_项目名_模块名_变量名
int google_num = 1;
int facebook_num = 1;
在c++中为了解决命名冲突的问题,使用了命名空间的机制,就是将一个模块或者组件的变量全部定义在一个命名空间内部,namespace中里面包含变量、函数、类、typedef,#define等。
namespace google{
int num = 1;
void printf(){
}
}
namespace baidu{
int num = 1;
void printf(){
}
}
命名空间有三种使用方式:
- 作用域限定符 最精确
- using申明机制 推荐使用
- using编译指令
std::cin; //每次使用cin都需要使用作用域限定符
using std::cin; //使用using申明机制,一次申明,多次使用
using google::printf();
using namespace std; //将命名空间的所有变量引入到程序中
注意:一次性引入了std全部实体,在不清楚所有内容的情况下可能会产生命名冲突。
using namespace std;
void cout(){ //命名冲突
//to DO
}
匿名空间:
匿名空间时特殊的命名空间,匿名空间的实体要避免与全局位置同名,如果同名,会优先找到全局变量,就算加::也访问不到,而匿名空间内的实体在逻辑上被丢弃了。
跨模块调用问题:
1.全局变量和函数可以跨模块调用==> 使用extern关键字引入其他模块的变量和函数。注意只能作为摆布的引入申明,不能修改变量的值。
2.静态变量和静态函数只能在本模块内部使用,完成信息隐藏
3.匿名空间的实体无法跨模块调用, 否则报错:undefine reference to (anonymous namespace )::num3;
注意:
有名空间跨模块调用时,要在定义一次有名空间,在空间中使用extern关键字引入需要的实体。
namespace google{
extern void num;
extern void printf();
}
void test0(){
cout << google::num << endl;
wd::printf();
}
命名空间是否只能定义一次?
命名空间可以定义多次,在同一个模块中多次定义一个同名的命名空间,编译器认为时同一个命名空间,其中要避免变量重名。
在多个模块中多次定义一个同名的命名空间,联合编译时也认为时同一个命名空间?