2011-12-17 79 views
2

Arguments類是在v8::internal命名空間中定義嵌套名稱空間如何工作?

https://github.com/joyent/node/blob/master/deps/v8/include/v8.h#L113

namespace v8 { 
// ... 
namespace internal { 
class Arguments; 
} 
// ... 
} 

然而,在v8命名空間以後用來訪問它

https://github.com/joyent/node/blob/master/src/handle_wrap.h#L38

using v8::Arguments; 

導致我去「嵌套命名空間如何工作?」這個問題。

+0

也許四個downvoters會仔細闡述爲什麼這是一個如此可怕的問題? – bitmask 2011-12-17 18:08:28

+1

這不應該工作。也許在v8命名空間中有一個'typedef internal :: Arguments Arguments'? – neodelphi 2011-12-17 18:11:55

+0

類參數似乎在名稱空間v8(第1934行)中定義。似乎前向聲明不用於任何事情(參數不需要在實現名稱空間中存在)。 – UncleBens 2011-12-17 18:55:46

回答

4

他們工作正如你所期望的。考慮單級名稱空間(例如std::)已經嵌套在全局名稱空間::中。除非應用using namespace std;指令,否則在全局名稱空間中只會註冊std名稱,並且std::中的符號不​​會直接對全局名稱空間可見。

添加第二層並應用相同的邏輯。在v8::internal符號不是在全局命名空間或v8::直接訪問,但using namespace v8;指令將拉動v8符號包括internal::(命名空間名稱,而不是其內容)到全局命名空間等

您肯定知道,有是將單個名稱拉入另一個命名空間的其他方法:using指令和typedef指令。除非有另一個類名爲v8::Arguments,否則有一個typedef或使用指令將v8::internal::Arguments拖入v8::中作爲v8::Arguments


就讓我們來看看在Node.js的V8引擎源代碼,確實是有一個名爲v8::Argumentsline 1946在命名空間v8::定義和命名空間v8::internal::沒有打開,直到line 3709類。

+0

這不回答這個問題。使用v8 :: Arguments的指令不適合你描述的任何情況。 – 2011-12-17 20:16:53

+1

@BjörnPollex:它故意不適合所描述的情況。這就是問題的答案,儘管是間接的。除非(a)有另一個名爲'v8 :: Arguments'的類,否則使用指令是行不通的。或者(b)在另一個使用指令或typedef的地方將'v8 :: internal :: Arguments'拉入'v8 ::'。我的答案會更清楚。 – 2011-12-17 20:22:38