什么是name mangling?
C++编译器会为代码中的每个函数签名生成全局唯一的名字,以方便后续定位和引用,这个名字是由函数名和函数参数组合而成的,不考虑返回值(这是合理的,因为在cpp语法中:函数签名相同但返回值不同的函数声明被认为是具有二义性的非法声明)。
怎么查看mangled name?
可以使用nm工具探查编译后的目标文件:
g++ -c t.cpp
nm t.o
如果t.cpp中这么写:
int foo(bool x) {
return 42;
}
int foo(int x) {
return 100;
}
那么会得到输出:
0000000000000000 T __Z3foob
0000000000000020 T __Z3fooi
其中,__Z
是gcc标识,3
是函数名foo的长度,foo
是函数名,b
或i
是参数类型列表(记得,函数中的参数名仅在定义体中是有用的),这里b
代表bool类型,i
代表int类型。
补充一些,nm命令可以显示文件中的符号ÿ