嵌套名称空间如何工作?
的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;
导致我去“嵌套命名空间如何工作?”这个问题。
他们工作正如你所期望的。考虑单级名称空间(例如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::Arguments
在line 1946在命名空间v8::
定义和命名空间v8::internal::
没有打开,直到line 3709类。
这不回答这个问题。使用v8 :: Arguments的指令不适合你描述的任何情况。 – 2011-12-17 20:16:53
@BjörnPollex:它故意不适合所描述的情况。这就是问题的答案,尽管是间接的。除非(a)有另一个名为'v8 :: Arguments'的类,否则使用指令是行不通的。或者(b)在另一个使用指令或typedef的地方将'v8 :: internal :: Arguments'拉入'v8 ::'。我的答案会更清楚。 – 2011-12-17 20:22:38
也许四个downvoters会仔细阐述为什么这是一个如此可怕的问题? – bitmask 2011-12-17 18:08:28
这不应该工作。也许在v8命名空间中有一个'typedef internal :: Arguments Arguments'? – neodelphi 2011-12-17 18:11:55
类参数似乎在名称空间v8(第1934行)中定义。似乎前向声明不用于任何事情(参数不需要在实现名称空间中存在)。 – UncleBens 2011-12-17 18:55:46