2

从C++编译器的角度来看,命名空间只是一种名称装饰约定?我检查了生成的程序集列表,发现除了标识符由命名空间的名称装饰以外,所有内容看起来都一样。C++编译器实现命名空间

+4

还有什么办法? :)毕竟,它是*名字* -space。 – Xion 2011-06-09 10:03:27

+1

是的。问题是什么? – Christopher 2011-06-09 10:03:58

回答

2

正如你指出的,名字改编的故事(但理由这样做有更多的是有接头,而不是编译器)的一部分。

但是,就编译器中的名称空间处理而言,名称修改远非全部。除此之外,编译器必须能够找出不合格的名称,这可能是不平凡的:请参阅argument-dependent lookup

0

从C++编译器的角度来看,命名空间只是一种名称装饰约定吗?

我想是的。它只是最后的名字装饰。

为了做到这一点,编译器做了很多事情。它在解析名称时选择正确的名称空间(可能超出许多名称空间)。

例如,

namespace X 
{ 
    void f(); //compiler chooses X only when decorating f() 
    namespace Y 
    { 
     void f(); //compiler chooses X and Y when decorating f() 
     void g() //compiler chooses X and Y when decorating g() 
     { 
      f(); //which f? Compiler decorates it with both X and Y. 
      X::f(); //which f? Compiler decorates it with X only. 
     } 
    } 
} 
+0

命名空间是否有某种范围?你可能有两个同名的类,但是这个名字空间可以防止碰撞。 – rcapote 2011-06-09 10:06:15

0

Bjarne Stroustrup编写的第一个C++编译器被称为CFront并非巧合。它将C++代码转换为C并将其提供给C编译器。所以,我认为它只是名字改编为超载&避免名称冲突(命名空间)创建独特的符号

+0

CFront没有名称空间。 – 2011-06-09 10:37:08

+1

@neil:我同意但是这个概念在那里是作为具有相同命名函数的类,因此它们需要命名修改,因为C需要唯一的函数名。 – hackworks 2011-06-09 10:44:38