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加進來,但又再次帶來了命名衝突的危險,因為多個命名空間都提到當前的範圍下,又有可能發生重名的問題。