# c++為什麼要引入命名空間?
假設有兩個班級,a班有位同學張三,b班也有位同學叫張三,因為某種原因,兩個班級需要合併,班級合併後就有兩個名叫張三的同學,老師需要點名同學回答問題時,那到底該誰起立回答呢?這就產生衝突了,通常的辦法可能是把年齡大的叫大張三,年齡小的叫小張三,這樣就能夠解決這個衝突了;而程式也是一樣的,對於c/c++來說,我們編譯程式後最終得到的都是乙個bin檔案,裡面的符號都是沒有隔離的,所以也會存在這種衝突;在c語言中我們基本只能靠程式設計師自己來規避這個問題,比如:函式名或變數名盡量帶有特殊標識字首或字尾;不會被外部檔案訪問的檔案內全域性變數與函式使用static修飾;而在c++中有了更好的解決方案,那就是命名空間。
你可以認為c++的命名空間就是在你編寫的函式或變數名在編譯的時候編譯器又給你新增了乙個字首,用語言的這種特性來解決衝突,而盡量不依靠程式設計師自身來解決。
# 語法
namespace ns;
# 使用方法
//使用此種方法,ns1內的成員在本檔案此句**後都是可見的
using namespace ns1;
//使用此種方法,僅僅ns1內的print成員在本檔案此句**後是可見的
using ns1::print;
//一般我們使用的都是這種方法,**用就在**指明
ns1::print();
//預設命名空間的兩種訪問方式,有宣告的地方都可以使用
::func();
func();
# 測試程式(第一種使用方法)
#ifndef __test_hpp
#define __test_hpp
namespace ns1;
};#endif/*__test_hpp*/
#include "test.hpp"
#include //編譯
//g++ test.cpp
void func(void)
using namespace ns1;
using namespace ns1::ns2;
int main(int argc,char *ar**)
void ns1::print(void)
void ns1::ns2::print(void)
## 執行結果
hello
hello
56
## 結論
命名空間可以巢狀;
不同命名空間內允許同名成員存在;
不同命名空間存在同名成員時,使用的時候任然需要指明其所在的命名空間(**第25及27行);
預設命名空間相當於具有全域性屬性,只要有宣告就能訪問;
# 測試程式(第二種使用方法)
#include "test.hpp"
#include //編譯
//g++ test.cpp
using ns1::data1;
using ns1::print;
using ns1::ns2::data2;
using ns1::ns2::print;
int main(int argc,char *ar**)
void ns1::print(void)
void ns1::ns2::print(void)
## 執行結果
5
6
## 結論
這種方式和第一種方式效果一樣,只是這種方式可以有選擇性,可控;
# 測試程式(第三種使用方法)
#include "test.hpp"
#include //編譯
//g++ test.cpp
int main(int argc,char *ar**)
void ns1::print(void)
void ns1::ns2::print(void)
## 執行結果
5
6
## 結論
雖然使用時可能需要寫一串的命名空間識別符號,但是給人的第一印象很好,一眼就能看出來自哪兒;
# 綜合結論
有三種使用方式,但是在方法(函式)實現的地方必須指明其從屬於哪個命名空間。
# 匿名命名空間
匿名命名空間即沒有給定命名空間的名字,這樣對於外部(檔案)來說不知道名字也就無法訪問了,所以其作用就是限定匿名命名空間中的成員只具有檔案內可見性,而不具備檔案外可見性(和c語言中檔案內全域性函式或變數被static修飾一樣)。
## 測試程式
#include //編譯
//g++ test.cpp
namespace
};int main(int argc,char *ar**)
## 執行結果
word
# 注意
三種方式是並存的,可以只用一種也可以幾種混用都是沒問題。
C 命名空間(namespace)學習
1 什麼叫 namespace?namespace 命名空間 是 c 提供的一種類的組織方式,將不同功能的類進行組織,管理。net framework 使用命名空間來組織它的眾多類 在較大的程式設計專案中,宣告自己的命名空間可以幫助控制類名稱和方法名稱的範圍。2 如何定義 namespace?nam...
C 學習之namespace的用法
fish.h ifndef test header fish define test header fish include namespace ns fish endif defined test header fish fish.cpp include include fish.h using ...
C 學習筆記1 namespace是什麼東西?
寫在前面 其實一開始不太懂什麼是namespace,剛開始學習的時候,照著敲using namespace std 老師也沒告訴是什麼意思,自己也沒有仔細看。到現在都還是很清楚。今天就查點資料,盡量弄清楚吧。namespace就是命名空間,為了防止程式設計師對不同的庫使用了相同的名字,出現名字衝突,...