定義
namespace 名字空間的名字{ 全局變量 類型定義 函數 }
意義
對于一個較大型的C++程序來說,需要由多個程序員相互協作編寫,這樣的情況下容易出現不同程序員在需要負責的程序部分使用相同名字的變量或函數,導致程序合并后出現問題。名字空間的作用,就是將不同程序員編譯的程序放入相應的名字空間,每個名字空間相對獨立,空間內的變量和函數名只局限于當前空間下,從而解決命名沖突的問題。
名字空間的三種使用方法
(1)作用域限定符 名字空間名::標識符 表示明確訪問是特定名字空間中的特定標識符 最麻煩 (2)名字空間指令 using namespace 名字空間名; 該語句可以在任何地方 表示在該指令之后,對指令所指的名字空間中所有標識符對當前作用域都可見 接下來都可以直接訪問名字空間中的標識符,不需要加"名字空間名::" 當然也可以加 *對當前作用域可見 (3)名字空間聲明 using 名字空間::標識符 將指定名字空間中的某個標識符(成員)引入到當前作用域,可以直接訪問 *導入到當前作用域
#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; 就只是其中的兩種定義方法,兩個是等價的*/
匿名空間
編譯器為沒有指明名字空間的全局區的標識符置于匿名名字空間中 如果要指明訪問匿名名字空間中的標識符 直接用 ::標識符 匿名的命名空間是C++的特性,相對于C的static聲明來說, 可以在匿名的空間里面聲明很多 變量和函數,這樣可以省去了對每個變量和函數添加static聲明. 實質上匿名空間的功能跟static聲明是一樣的
#include <iostream> using namespace std; //如果一個全局的標識符沒有指定名字空間,編譯器將會為其缺省地置于匿名名字空間中 int gv = 1024; int main(){ cout << gv << endl; cout << ::gv << endl; //訪問指定名字(匿名名字)空間中的標識符 int gv = 9527; cout << gv << endl;//訪問局部的 局部優先原則 同名的局部變量會隱藏同名的全局變量 cout << ::gv << endl;//訪問全局的 return 0; }
名字空間合并
一個程序中,如果名字空間名字相同,則認為是同一個名字空間 里面的標識符會進行合并
#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; }
名字空間嵌套
一個名字空間包含另外一個名字空間 不能直接 using namespace 里層名字空間; 對于當前作用域而言是不可見
#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;//有兩個名字空間中都有x 因為它們對當前作用域沒有優先級關系 所以會有歧義 return 0; }
using namespace 外層名字空間;
using namespace 里層名字空間;
using namespace 外層名字空間::里層名字空間;
注意: 如果用using namespace 名字空間;進行名字空間聲明當前作用域可見 如果不同的兩個作用域中含有相同名字和標識符,不訪問沒問題 但是如果用直接訪問,則會產生歧義 using namespace 名字空間; 進行聲明不會有歧義 using 名字空間名::標識符 可能會有歧義
舉個例子來說明
#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;//會有歧義 cout << s1::x << endl; cout << s2::x << endl; using s2::x; //導入到當前作用域 cout << x << endl; cout << s1::x << endl; //using s1::x;//當前作用域中有一個x了 return 0; }
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://blog.csdn.net/weixin_53272394/article/details/120166898