不要在頭文件中使用 using

命名空間是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”,而應該在聲明時直接用全稱。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章