命名空间一共有三种使用方式,分别是using编译指令、作用域限定符、using声明机制。
using声明机制的特点是:需要哪个实体的时候就引入到程序中,不需要的实体就不引入,尽可能减小犯错误的概率。
将using编译指令写在局部作用域,这样using编译指令的效果也会在其作用域结束时结束。
当然如果需要在同一个作用域下使用两个命名空间中同名的实体,这种方法就不可行了,可以采用第一种方式加上命名空间的作用域限定。
命名空间的嵌套使用(搜索引擎其二)
类似于文件夹下还可以建立文件夹,命名空间中还可以定义命名空间。那么内层命名空间中的实体如何访问呢?
namespace wd
{
int num = 100;
void func(){
cout << "func" << endl;
}
namespace cpp
{
int num = 200;
void func(){
cout << "cpp::func" << endl;
}
}//end of namespace cpp
}//end of namespace wd
//方式一,使用作用域限定精确访问实体
void test0(){
cout << wd::cpp::num << endl;
wd::cpp::func();
}
//方式二,using编译指令一次性引入cpp的实体
void test1(){
using namespace wd::cpp;
cout << num << endl;
func();
}
//方式三,using声明语句
void test2(){
using wd::cpp::num;
using wd::cpp::func;
cout << num << endl;
func();
}
匿名命名空间(了解)
命名空间还可以不定义名字,不定义名字的命名空间称为匿名命名空间(简称匿名空间)。
通常,如果我们希望一部分实体只在本文件中起作用,那么可以将它们定义在匿名空间中。
其定义方式如下:
namespace {
//...
}//end of anonymous namespace
使用匿名空间中实体时,可以直接使用,也可以加上作用域限定符(没有空间名)
namespace {
int val = 10;
void func(){
cout << "func()" << endl;
}
}//end of anonymous namespace
//以下用法均ok
void test0(){
cout << val << endl;
cout << ::val << endl;
func();
::func();
}
什么时候使用匿名空间?
匿名空间注意事项:
(1)匿名空间不要定义与全局空间中同名的实体;
(2)匿名空间中的实体不能跨模块调用。
概念:匿名空间和有名空间(具名空间)统称为命名空间(名称空间、名字空间)。
跨模块调用问题
一个.c/.cc/*.cpp的文件可以称为一个模块。
补充:vim多窗口操作技巧
:e 文件名(带路径) 若文件存在就打开,不存在就创建 :bp 打开上一个窗口 :bn 打开下一个窗口 :bd 关闭当前窗口
1、全局变量和函数是可以跨模块调用的
//externA.cc int num = 100; void print(){ cout << &