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