1. 程式人生 > >名稱空間namespace ,以及重複定義的問題解析

名稱空間namespace ,以及重複定義的問題解析

名字空間是用來劃分衝突域的,把全域性名字空間劃分成幾個小的名字空間。全域性函式,全域性變數,以及類的名字是在同一個全域性名字空間中,有時為了防止命名衝突,會把這些名字放到不同的名字空間中去。

首先我們看一下名字空間的定義:

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的重複定義。