有人可以給我解釋一下下面的命名慣例之間的差別領先::平均:什麼在C 「使用命名空間:: X」 ++
using namespace ::layer::module;
和
using namespace layer::module;
什麼原因導致在layer
之前增加::
?
有人可以給我解釋一下下面的命名慣例之間的差別領先::平均:什麼在C 「使用命名空間:: X」 ++
using namespace ::layer::module;
和
using namespace layer::module;
什麼原因導致在layer
之前增加::
?
會有區別,如果它是在一個上下文中使用,例如:
namespace layer {
namespace module {
int x;
}
}
namespace nest {
namespace layer {
namespace module {
int x;
}
}
using namespace /*::*/layer::module;
}
在初始::
第一x
將是使用指令之後可見的,沒有它裏面nest::layer::module
第二x
將是變得可見。
+1爲好的答案 –
第二種情況可能是X::layer::module
其中using namespace X
已經發生。
在第一種情況下,前綴::
的意思是「編譯器,不要聰明,從全球名稱空間開始」。
領先::
指全局命名空間。任何以::
開頭的合格標識符將始終引用全局名稱空間中的某個標識符。所不同的是,當你有同樣的東西,在全球以及在一些地方命名空間:
namespace layer { namespace module {
void f();
} }
namespace blah {
namespace layer { namespace module {
void f();
} }
using namespace layer::module // note: no leading ::
// refers to local namespace layer
void g() {
f(); // calls blah::layer::module::f();
}
}
namespace blubb {
namespace layer { namespace module {
void f();
} }
using namespace ::layer::module // note: leading ::
// refers to global namespace layer
void g() {
f(); // calls ::layer::module::f();
}
}
它被稱爲合格的名稱查找在C++中。
這表示所引用的圖層名稱空間是全局名稱空間之外的名稱空間,而不是另一個名爲layer的嵌套名稱空間。
對於Standerdese球迷:
$ 3.4.3/1
「一類或命名空間成員的名稱可以在::範圍解析運算符(5.1)之後被稱爲施加到嵌套名稱說明符指定其類或名稱空間在:: scope解析運算符之前查找名稱期間,將忽略對象,函數和枚舉器名稱如果找到的名稱不是類名稱(第9節)或命名空間名稱(7.3.1),該程序是不合格的。「
這是http://stackoverflow.com/q/4925394/498253 – Tom
@Tom的重複:但是,這確實是一個確切的愚蠢? – sbi
@sbi:是的,'什麼是prepending ::是什麼意思 - 爲什麼它被使用?但由於這裏有更多的答案比我沒有關閉 - 我只是認爲該鏈接將有所幫助 – Tom