我读过一篇文章,指出编译器更改了具有相同名称的函数的名称(名称修饰),以避免名称冲突。
请考虑以下示例。
void fun(int x)
{
cout<<x<<endl;
}
void fun(float x)
{
cout<<x<<endl;
}
int main()
{
fun(10);
fun(10.5f);
return 0;
}
上面是一个非常简单的函数重载示例。这里,在编译代码时,编译器将更改函数名称,以便链接程序可以在两个不同的调用之间链接。
问题:需要进行什么处理?
由于参数具有不同的数据类型,因此足以与适当的函数链接。为什么编译器为什么要执行名称处理?
答案 0 :(得分:6)
链接器不知道重载(对于多种语言,它必须是通用的)。它只知道需要解决的符号。
编译器的名称修改为两个函数重载创建了两个不同的符号,从而使链接程序可以将它们解析为正确的函数。