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

C++ Compiler Implementing Namespace

本文关键字:命名空间 实现 编译器 C++      更新时间:2023-10-16

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

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

然而,就编译器中名称空间的处理而言,名称篡改远不是全部。除其他外,编译器必须能够找出不合格的名称,这可能是不平凡的:请参阅参数相关查找。

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

从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.
      }
  }
}
Bjarne Stroustrup编写的第一个C++编译器被称为CFront,这绝非巧合。它将C++代码转换为C,并将其提供给C编译器。所以,我相信这只是名称篡改,为重载创建独特的符号&避免名称冲突(命名空间)