名字空間是用來划分沖突域的,把全局名字空間划分成幾個小的名字空間。全局函數,全局變量,以及類的名字是在同一個全局名字空間中,有時為了防止命名沖突,會把這些名字放到不同的名字空間中去。
首先我們看一下名字空間的定義:
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的重復定義。