从C ++编译器的角度来看,命名空间只是一个名称装饰约定?我检查了生成的程序集列表,发现除了标识符由命名空间名称修饰外,所有内容看起来都一样。
答案 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编译器。因此,我认为为重载创建唯一符号只是名称错误。避免名称冲突(命名空间)