C++ 命名空間--namespace總結(jié)
定義
namespace 名字空間的名字{ 全局變量 類型定義 函數(shù) }
意義
對(duì)于一個(gè)較大型的C++程序來(lái)說(shuō),需要由多個(gè)程序員相互協(xié)作編寫,這樣的情況下容易出現(xiàn)不同程序員在需要負(fù)責(zé)的程序部分使用相同名字的變量或函數(shù),導(dǎo)致程序合并后出現(xiàn)問(wèn)題。名字空間的作用,就是將不同程序員編譯的程序放入相應(yīng)的名字空間,每個(gè)名字空間相對(duì)獨(dú)立,空間內(nèi)的變量和函數(shù)名只局限于當(dāng)前空間下,從而解決命名沖突的問(wèn)題。
名字空間的三種使用方法
(1)作用域限定符 名字空間名::標(biāo)識(shí)符 表示明確訪問(wèn)是特定名字空間中的特定標(biāo)識(shí)符 最麻煩 (2)名字空間指令 using namespace 名字空間名; 該語(yǔ)句可以在任何地方 表示在該指令之后,對(duì)指令所指的名字空間中所有標(biāo)識(shí)符對(duì)當(dāng)前作用域都可見(jiàn) 接下來(lái)都可以直接訪問(wèn)名字空間中的標(biāo)識(shí)符,不需要加"名字空間名::" 當(dāng)然也可以加 *對(duì)當(dāng)前作用域可見(jiàn) (3)名字空間聲明 using 名字空間::標(biāo)識(shí)符 將指定名字空間中的某個(gè)標(biāo)識(shí)符(成員)引入到當(dāng)前作用域,可以直接訪問(wèn) *導(dǎo)入到當(dāng)前作用域
#include <iostream> using namespace std; //定義名字空間 namespace wd1{ int g = 1024; void func(void){ cout << "func" << endl; } struct Stu{ int no; char name[40]; }; } int main(){ using wd1::g; cout << g << endl; cout << wd1::g << endl; wd1::func(); struct wd1::Stu s = {}; using namespace wd1; cout << g << endl; func(); struct Stu s2 = {}; return 0; } /*using wd1::g; cout << g << endl; 和 cout << wd1::g << endl; 就只是其中的兩種定義方法,兩個(gè)是等價(jià)的*/
匿名空間
編譯器為沒(méi)有指明名字空間的全局區(qū)的標(biāo)識(shí)符置于匿名名字空間中 如果要指明訪問(wèn)匿名名字空間中的標(biāo)識(shí)符 直接用 ::標(biāo)識(shí)符 匿名的命名空間是C++的特性,相對(duì)于C的static聲明來(lái)說(shuō), 可以在匿名的空間里面聲明很多 變量和函數(shù),這樣可以省去了對(duì)每個(gè)變量和函數(shù)添加static聲明. 實(shí)質(zhì)上匿名空間的功能跟static聲明是一樣的
#include <iostream> using namespace std; //如果一個(gè)全局的標(biāo)識(shí)符沒(méi)有指定名字空間,編譯器將會(huì)為其缺省地置于匿名名字空間中 int gv = 1024; int main(){ cout << gv << endl; cout << ::gv << endl; //訪問(wèn)指定名字(匿名名字)空間中的標(biāo)識(shí)符 int gv = 9527; cout << gv << endl;//訪問(wèn)局部的 局部?jī)?yōu)先原則 同名的局部變量會(huì)隱藏同名的全局變量 cout << ::gv << endl;//訪問(wèn)全局的 return 0; }
名字空間合并
一個(gè)程序中,如果名字空間名字相同,則認(rèn)為是同一個(gè)名字空間 里面的標(biāo)識(shí)符會(huì)進(jìn)行合并
#include <iostream> using namespace std; namespace myspace{ int x = 1024; void func(){ cout << "func" << endl; } } namespace myspace{ int y = 9527; void bar(){ cout << "bar" << endl; } } int main(){ using namespace myspace; cout << x << endl; cout << y << endl; func(); bar(); return 0; }
名字空間嵌套
一個(gè)名字空間包含另外一個(gè)名字空間 不能直接 using namespace 里層名字空間; 對(duì)于當(dāng)前作用域而言是不可見(jiàn)
#include <iostream> using namespace std; //int x = 1; namespace s1{ int x = 1024; namespace s2{ int y = 9527; namespace s3{ int z = 1314; } } namespace s4{ int x = 520; } } int main(){ using s1::x; cout << x << endl; cout << s1::x << endl; //cout << y << endl; cout << s1::s2::y << endl; using s1::s2::y; cout << y << endl; using namespace s1; using s2::y; //using namespace s3; using namespace s1::s2::s3; cout << z << endl; using namespace s4; cout << x << endl;//有兩個(gè)名字空間中都有x 因?yàn)樗鼈儗?duì)當(dāng)前作用域沒(méi)有優(yōu)先級(jí)關(guān)系 所以會(huì)有歧義 return 0; }
using namespace 外層名字空間;
using namespace 里層名字空間;
using namespace 外層名字空間::里層名字空間;
注意: 如果用using namespace 名字空間;進(jìn)行名字空間聲明當(dāng)前作用域可見(jiàn) 如果不同的兩個(gè)作用域中含有相同名字和標(biāo)識(shí)符,不訪問(wèn)沒(méi)問(wèn)題 但是如果用直接訪問(wèn),則會(huì)產(chǎn)生歧義 using namespace 名字空間; 進(jìn)行聲明不會(huì)有歧義 using 名字空間名::標(biāo)識(shí)符 可能會(huì)有歧義
舉個(gè)例子來(lái)說(shuō)明
#include <iostream> using namespace std; namespace s1{ int x = 1111; } namespace s2{ int x = 9527; } int main(){ cout << s1::x << endl; cout << s2::x << endl; using namespace s1; cout << x << endl; using namespace s2; // cout << x << endl;//會(huì)有歧義 cout << s1::x << endl; cout << s2::x << endl; using s2::x; //導(dǎo)入到當(dāng)前作用域 cout << x << endl; cout << s1::x << endl; //using s1::x;//當(dāng)前作用域中有一個(gè)x了 return 0; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04C 語(yǔ)言基礎(chǔ)之C 語(yǔ)言三大語(yǔ)句注意事項(xiàng)
今天講解的內(nèi)容,則是自己對(duì)于這三種語(yǔ)句一些細(xì)節(jié)的簡(jiǎn)單介紹,分支語(yǔ)句:if,switch、循環(huán)語(yǔ)句:while,for,do while、goto語(yǔ)句,感興趣的小伙伴可以參考下面具體的文章內(nèi)容2021-09-09