C++符号修饰
C++拥有类、继承、虚机制、重载、名称空间这些特性,使得符号管理更加复杂。例如:针对如下
两个函数fun(int)和fun(double),函数名字相同,但是参数不同,这是C++里面函数重载的最简单
的一种情况,那么编译器和链接器在链接过程中是怎样区分这两个函数呢?为此,C++引入了符号
修饰(Name Decoration)和符号改编(Name Mangling)。
比如有如下代码:
//nameDe.c
int func(int);
float func(float);
class C {
int func(int);
class C2 {
int func(int);
};
};
namespace N {
int func(int);
class C {
int func(int);
};
};
这段代码中又6个同名的函数func,只不过它们的返回类型和参数以及所在的名称空间不同,由此
引入了一个术语函数签名(Function Signature),函数签名包含了一个函数的信息,包括函数名、
参数类型、所在的类和名称空间以及其他信息,在编译器和链接器处理符号时,它们使用某种名称
修饰方法,使得每个函数签名对应一个修饰后名称。C++编译器和链接器都使用符号来识别和处理
函数和变量,所以对于不同函数签名的函数,即使函数名相同,编译器和链接器都认为他们是不同
的函数。上面6个函数签名在GCC编译器下,相对应的修饰后名称为:
int func(int) _Z4funi
float func(float) _Z4funcf
int C::func(int) _ZN1C4funcEi
int C::C2::func(int) _ZN1C2C24funcEi
int N::func(int) _ZN1N4funcEi
int N::C::func(int) _ZN1N1C4funcEi