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

C++;实现命名空间的编译器 从C++编译器的角度来看,命名空间只是一个名称修饰约定吗?我检查了生成的程序集列表,发现除了标识符由名称空间的名称修饰外,所有内容看起来都一样 从C++编译器的角度来看,命名空间只是一个名称修饰约定吗?,c++,compiler-construction,namespaces,implementation,name-decoration,C++,Compiler Construction,Namespaces,Implementation,Name Decoration,我想是的。它只是结尾的一个名字装饰 为了做到这一点,编译器做了很多事情。解析名称时,它可能会从多个名称空间中选择正确的名称空间 比如说, 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

我想是的。它只是结尾的一个名字装饰

为了做到这一点,编译器做了很多事情。解析名称时,它可能会从多个名称空间中选择正确的名称空间

比如说,

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.
      }
  }
}

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


然而,就编译器中名称空间的处理而言,名称损坏远远不是全部。除其他事项外,编译器必须能够找出非限定名称,这可能非常重要:请参阅。

据我所知,这就是它。描述可在名称mangling下找到:

< P> Bjarne Stroustrup调用的第一个C++编译器不是偶然的。它将C++代码转换成C,并将其导入C编译器。因此,我认为创建用于重载的唯一符号只是名称混乱&避免名称冲突(名称空间)

,但您还期望什么呢?:)毕竟是名字空间,是的。问题是什么?名称空间没有某种作用域吗?您可能有两个具有相同名称的类,但名称空间可以防止冲突。CFront没有名称空间。@neil:我同意,但概念是作为具有相同命名函数的类存在的,因此它们需要名称混乱,因为C需要唯一的函数名。