命名空间是c++提供的一种机制,可以有效地避免函数名污染。然后在应用时要十分注意:任何情况下都不应在头文件中使用“using namespace xxx”这样的语句。

这是为什么呢?来看下面的例子,我们在命名空间ABC和XYZ中分别定义了一个sort函数,如下所示:

  1. // 文件 abc.h  
  2. namespace ABC  
  3. {  
  4.     void sort() { ... }  
  5. }  
  6.  
  7. // 文件 xyz.h  
  8. namespace XYZ  
  9. {  
  10.     void sort() { ... }  

如果我们在一个头文件 data.h 中用到了命名空间 ABC 中的 sort 函数:

  1. // 文件 data.h  
  2. #include "abc.h"  
  3. using namespace ABC;  
  4.  
  5. void DoSomething()   
  6. {  
  7.      // use sort() to do something  

麻烦马上就要出现了!如果我们在另一个文件中同事用到了 data.h 中的 DoSomething() 和 xyz.h 中的  sort(),编译器就会报错:“error C2688: 'XYZ::‘sort’,对重载函数的调用不明确”。

  1. #include "data.h"  
  2. #include "xyz.h"  
  3.  
  4. using namespace XYZ;  
  5. int DataProcessing()  
  6. {  
  7.     sort();  
  8.     DoSomething();  

这就是传说中的命名空间污染。

之所以会出现这个问题,是因为在包含头文件 data.h 的源文件中相当于也用了"unsing namespace ABC",而这样的命名空间引入是在不知不觉中完成的。

因此,最好不要在头文件里面使用“using names XXX”,而应该在声明时直接用全称。