命名空间是c++提供的一种机制,可以有效地避免函数名污染。然后在应用时要十分注意:任何情况下都不应在头文件中使用“using namespace xxx”这样的语句。
这是为什么呢?来看下面的例子,我们在命名空间ABC和XYZ中分别定义了一个sort函数,如下所示:
- // 文件 abc.h
- namespace ABC
- {
- void sort() { ... }
- }
- // 文件 xyz.h
- namespace XYZ
- {
- void sort() { ... }
- }
如果我们在一个头文件 data.h 中用到了命名空间 ABC 中的 sort 函数:
- // 文件 data.h
- #include "abc.h"
- using namespace ABC;
- void DoSomething()
- {
- // use sort() to do something
- }
麻烦马上就要出现了!如果我们在另一个文件中同事用到了 data.h 中的 DoSomething() 和 xyz.h 中的 sort(),编译器就会报错:“error C2688: 'XYZ::‘sort’,对重载函数的调用不明确”。
- #include "data.h"
- #include "xyz.h"
- using namespace XYZ;
- int DataProcessing()
- {
- sort();
- DoSomething();
- }
这就是传说中的命名空间污染。
之所以会出现这个问题,是因为在包含头文件 data.h 的源文件中相当于也用了"unsing namespace ABC",而这样的命名空间引入是在不知不觉中完成的。
因此,最好不要在头文件里面使用“using names XXX”,而应该在声明时直接用全称。