C ++编译器实现命名空间

时间:2011-06-09 10:01:30

标签: c++ compiler-construction namespaces implementation name-decoration

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

4 个答案:

答案 0 :(得分:2)

正如你所指出的,名称修改是故事的一部分(但这样做的原因更多地与链接器而不是编译器有关。)

然而,就编译器中名称空间的处理而言,名称修改远不是完整的故事。除其他外,编译器必须能够找出不合格的名称,这可能是非平凡的:请参阅argument-dependent lookup

答案 1 :(得分: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.
      }
  }
}

答案 2 :(得分:0)

据我所知,这就是它。可以在名称修改下找到描述: http://en.wikipedia.org/wiki/Name_mangling

答案 3 :(得分:0)

Bjarne Stroustrup编写的第一个C ++编译器被称为CFront并非巧合。它将C ++代码转换为C并将其提供给C编译器。因此,我认为为重载创建唯一符号只是名称错误。避免名称冲突(命名空间)