1. 同一文件内使用namespace
(1)namespace的三种引用方法
//方式一
ace::Mutex mutex;
例如:
namespace NS1
{
void func2(void)
{
}
void func1(void)
{
}
}
void func1(void);
int main(void)
{
NS1::func1(); //用到一个声明一个
return 0;
}
//方式二
using ace::Mutex; //一次性只声明了指定命名空间里面的一个变量或函数
例子
namespace NS1
{
void func2(void)
{
}
void func1(void)
{
}
}
using NS1::func1; //告诉编译器如果在默认的命名空间找不到func1可以到NS1中去找一下
int main(void)
{
func1();
return 0;
}
//方式三
using namespace ace;
Mutex mutex;
namespace NS1
{
void func2(void)
{
}
void func1(void)
{
}
}
using namespace NS1; //一次性声明指定命名空间里面的所有变量函数等
int main(void)
{
func1();
return 0;
}
总结:第一种是用到哪个就去声明哪个,没有引入额外的负担,什么意思呢?using这里有点像include关键字,就是把整个文件拿过来在这里原地展开,假设include的包含的那个文件有700行,include这行代码就相当于把那700行的代码全部搂过来了,这种做法还是有一定开销的,对编译器的压力就比较大。
第二种只using进来一个符号,第三种把命名空间的所有符号全部都using进来了,从成本的角度来说,第一种到第二种到第三种的成本是依次递升,但是方便性是越来越好的。实战当中第一种和第三种用的比较多,第二种用的比较少。
2. 跨文件来使用namespace怎么声明?
namespace NS2{void func3(void);}; //你有东西在另一个文件中,你要使用可以,但是你得先声明
namespace NS2{extern void func3(void);}; //namespace这种思想与要使用跨文件使用变量或函数是类似的
//声明的时候不可以有实体,有实体就变成定义了
using namespace NS2; //命名空间引用
3. 默认命名空间
默认命名空间就是没有放在特定命名空间里面的,C++中只有唯一的一个,就是main函数
int main(void)
{
func3();
return 0;
}
main函数必须放在默认空间里面的,不能放在特定命名空间里面的
(1)默认命名空间又叫全局命名空间
(3)默认命名空间里面引用其他命名空间的方法
就是上面提到的三种引用方法,
(4)默认命名空间引用自己的方法
与C语言的函数引用没什么区别
(5)其他命名空间引用默认命名空间的方法
void func5(void); //函数的声明要放在引用它的命名空间之前,因为编译只会往前回顾,不会往后看的。
namespace NS1
{
void func2(void)
{
::func5(); //表示func5定义和声明在默认命名空间,因为命名空间的名字是空的,所以冒号的前面是空的,
// 也可以省略双冒号,最好加上,不加的话给人的感觉func5()是NS1里面的
//func1(); //如果是特定的命名空间内部访问自己的东西,前面什么都不用加
}
void func1(void)
{
}
};
//namespace NS2{void func3(void);};
namespace NS2{extern void func3(void);};
using namespace NS2;
int main(void)
{
func3();
return 0;
}
void func5(void)
{
}