名稱空間namespace ,以及重複定義的問題解析
阿新 • • 發佈:2019-02-07
名字空間是用來劃分衝突域的,把全域性名字空間劃分成幾個小的名字空間。全域性函式,全域性變數,以及類的名字是在同一個全域性名字空間中,有時為了防止命名衝突,會把這些名字放到不同的名字空間中去。
首先我們看一下名字空間的定義:
1 //MyLib.h檔案 2 namespace MyLib{ 3 extern int i;//記住這是變數i的宣告,不是i的定義 4 void fun(); 5 }//注意名字空間不像類的定義一樣,右大括號後有分號
//MyLib.cpp檔案 #include<iostream> #include"MyLib.h"//包含名字空間生命所在的檔案 using std::cout;//這是使用生命,不是使用指令using std::endl; int MyLib::i=10;//這是變數i的定義,並且初始化,當然也可以不用初始化直接寫int MyLib::i; void MyLib::fun(){ cout<<i<<endl; }
上述程式碼有一個特別需要注意的地方就是:
在MyLib.h檔案中,使用同一種方式定義函式和變數,無論函式還是變數都必須使用宣告
原因:在多次包含標頭檔案MyLib.h時,會出現重複定義的錯誤.
例如
//A.h檔案 namespace A{ int i;//變數的定義,不是宣告 void fun();//函式的宣告,不是定義,那麼函式的定義可以放在A.cpp檔案中,此時A.cpp檔案需要#include“A.h“,}
1 //A.cpp 2 #include"A.h" 3 void A::fun(){ 4 5 6 }
//demo.cpp #include"A.h" int main(){ return 0; }
上述三段程式碼會出現問題,因為A.cpp從新定義了變數i,變數i本來已經在A.h中已經定義,而A.cpp中又包含了A.h,相當於把A.h中的所有程式碼複製貼上到A.cpp中。此時自然就造成i的重複定義。