2011-12-17 74 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