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數據成員