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需要唯一的函数名。