命名空間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的重復定義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM