當(dāng)定義一個(gè)命名空間時(shí),可以忽略這個(gè)命名空間的名稱:
namespce {
char c;
int i;
double d;
}
編譯器在內(nèi)部會(huì)為這個(gè)命名空間生成一個(gè)唯一的名字,而且還會(huì)為這個(gè)匿名的命名空間生成一條using指令。所以上面的代碼在效果上等同于:
namespace __UNIQUE_NAME_ {
char c;
int i;
double d;
}
using namespace __UNIQUE_NAME_;
在匿名命名空間中聲明的名稱也將被編譯器轉(zhuǎn)換,與編譯器為這個(gè)匿名命名空間生成的唯一內(nèi)部名稱(即這里的__UNIQUE_NAME_)綁定在一起。還有一點(diǎn)很重要,就是這些名稱具有internal鏈接屬性,這和聲明為static的全局名稱的鏈接屬性是相同的,即名稱的作用域被限制在當(dāng)前文件中,無法通過在另外的文件中使用extern聲明來進(jìn)行鏈接。如果不提倡使用全局static聲明一個(gè)名稱擁有internal鏈接屬性,則匿名命名空間可以作為一種更好的達(dá)到相同效果的方法。
注意:命名空間都是具有external 連接屬性的,只是匿名的命名空間產(chǎn)生的__UNIQUE_NAME__在別的文件中無法得到,這個(gè)唯一的名字是不可見的.
C++ 新的標(biāo)準(zhǔn)中提倡使用匿名命名空間,而不推薦使用static,因?yàn)閟tatic用在不同的地方,涵義不同,容易造成混淆.另外,static不能修飾class