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