C++中的命名空間namespace,命名空間namespace

來源:互聯網
上載者:User

C++中的命名空間namespace,命名空間namespace

 

在一個企業級的開發中,一個工程往往會很大,定義的類和方法也會特別多,而且還會引入很多的第三方庫,這就不可避免的會有一些同名的衝突問題。在Java中有包(Package)的概念,也就是將不同功能的類分成不同的包,來解決名稱的衝突,C++中是用命名空間來解決這種衝突的。 

 

什麼是命名衝突

假設你的程式中有一個第三方庫ThirdLib.lib,裡面有一個全域的函數 void HelloWorld();你又在自己的工程中再次定義一個HelloWorld(),則會有命名衝突。

再比如,一個大的工程有多個人同時開發,每個人開發一個模組,其中有A模組和B模組分別有甲、乙兩個人開發。假設A模組有一個struct結構Node,B模組也有一個struct結構Node,由於是兩個人開發,A中的Node和B中的Node雖然名字相同但結構卻不同。如果A、B兩個模組都沒有命名空間就會發生衝突,因為同一個範圍內不能有兩個同命的類。

像這樣導致命名衝突的情況還有很多,總結來說就是在相同的範圍內出現多個同名的類、函數或變數。

 

定義命名空間

【例1】

 Hello.h

#pragma oncenamespace SH{class Hello{public:Hello(void);~Hello(void);public:void SayHello();};void HelloWord();}

Hello.cpp

#include "StdAfx.h"#include "Hello.h"#include <iostream>using std::cout;using std::endl;namespace SH{Hello::Hello(void){}Hello::~Hello(void){}void Hello::SayHello(){cout << "how are you!" << endl;}void HelloWord(){cout << "Hello World!" << endl;}}


Hello.cpp還可以定義成這樣:

 

SH::Hello::Hello(void){}SH::Hello::~Hello(void){}void SH::Hello::SayHello(){cout << "how are you!" << endl;}void SH::HelloWord(){cout << "Hello World!" << endl;}

【例2】命名空間的定義也可以是不連續的,如:

Hello.h

#pragma oncenamespace SH{class Hello{public:Hello(void);~Hello(void);public:void SayHello();};}void HelloWord();namespace SH{void Hello2Sunly();}


Hello.cpp

 

#include "StdAfx.h"#include "Hello.h"#include <iostream>using std::cout;using std::endl;SH::Hello::Hello(void){}SH::Hello::~Hello(void){}void SH::Hello::SayHello(){cout << "how are you!" << endl;}void HelloWord(){cout << "Hello World!" << endl;}void SH::Hello2Sunly(){cout << "Hello Sunly!" << endl;}

上面的例子中類Hello和函數Hello2Sunly的命名空間相同,都是SH。HelloWord並沒有在SH命名空間上,是在預設的全域命名空間內。

 

 

使用命名空間加命名空間的首碼和範圍運算附

 

#include "stdafx.h"#include <iostream>int main(){std::cout << "Hello World!" << std::endl;return 0;}

這種方式最安全,因為使用的每個變數都用命名空間的首碼指明了具體的版本。但比較麻煩,因為每次使用都要加首碼。


using聲明

 

#include "stdafx.h"#include <iostream>using std::cout;using std::endl;int main(){cout << "Hello World!" << endl;return 0;}

需要哪個變數時就聲明哪個變數,這種方式相對較安全,也不至於太麻煩,只推薦的一種方式。用using引入的變數,其範圍從using指示開始一直到using指示所在的範圍結束。


using 指示

 

#include "stdafx.h"#include <iostream>#include "Hello.h"using namespace std;using namespace SH;int main(){cout << "Hello World!" << endl;Hello2Sunly();return 0;}

這種方式將某一命名空間下的所有變數都注入進來了,這種方式使編程更簡單了,不用把需要用到的變數一個一個地用using加進來,但又再次帶來了命名衝突的危險,因為多個命名空間都提到當前的範圍下,又有可能發生重名的問題。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.