c++中無名命名空間的使用


1. 命名空間作用

命名空間是程序設計者命名的內存區域,程序設計者根據需指定一些有名字的空間域,把一些全局實體分別存放到各個命名空間中,從而與其他全局實體分隔開。
通俗的說,每個名字空間都是一個名字空間域,存放在名字空間域中的全局實體只在本空間域內有效。名字空間對全局實體加以域的限制,從而合理的解決命名沖突。命名空間就是為了避免可能的名字沖突,保持代碼的局部性。例:

namespace Mine  
{  
    int a;  
    void f(){/*...*/}  
    int g() {/*...*/}  
}  

可用using使用命名空間中的變量

using后面的命名空間成員名必須是有命名空間限制的名字

例:

using Mine::a;

這樣每次使用Mine中的成員時都必須加上using Mine::變量名,
如果Mine中的成員較多則可以直接

using namespace 命名空間名

聲明了在本作用域中要用到命名空間中的成員,在使用該命名空間內的任何成員時都不必使用命名空間限定。

2. 無名命名空間

但是有時我們並不希望名字Mine被局部的環境之外知道,此時名字Mine似乎多余了,因此我們可以省去這個Mine名字 直接改寫為:

namespace   
{  
    int a;  
    void f(){/*...*/}  
    int g() {/*...*/}  
}  

完整:

#include<iostream>
using namespace std;

namespace
{
    int a;
    void f(){cout<<"a";}
    int g() {return 1;}
}

int main()
{
    f();cout<<endl;
    cout<<g()<<endl;
}

/*
a
1
*/

定義無名命名空間后,外部即不能得知無名命名空間的成員名字,即不讓外部知道我的成員名字及其調用
由於沒有名字,所以其它文件無法引用,它只能在本文件的作用域內有效,
它的作用域:重無名命名空間聲明開始到本文件結束。在本文件使用無名命名空間成員時不必用命名空間限定。其實無名命名空間和static是同樣的道理,都是只在本文件內有效,無法被其它文件引用。
note:

  • 無名命名空間允許無限定的使用其成員函數,並且為它提供了內部連接(只有在定義的文件內可以使用
  • 命名空間不需要命名,它的成員不需要限定就可以使用。
  • 如果在一個文件中包含了兩個相同成員的無名命名空間,其含義是不明確的,會導致重復定義的錯誤。
  • 無名命名空間可以替代全局作用域的static數據成員


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM