为了实现函数重载,C++编译器一般会采用名字改编的方式为每个重载的函数生成一个独一无二的名字,这样在链接的时候就能找到正确的重载版本,例如:
int test(bool x)
{
return 1;
}
int test(int x)
{
return 100;
}
int main(void)
{
return 0;
}
查看重载后的函数名称:
方法1:利用nm和c++filt
root@ubuntu:/home/qpz# nm test.o
0000001d T main
00000000 T _Z4testb
00000013 T _Z4testi
root@ubuntu:/home/qpz# c++filt _Z4testb _Z4testi
test(bool)
test(int)
方法二:利用objdump
080483ed <_Z4testb>:
80483ed: 55 push %ebp
80483ee: 89 e5 mov %esp,%ebp
80483f0: 83 ec 04 sub $0x4,%esp
80483f3: 8b 45 08 mov 0x8(%ebp),%eax
80483f6: 88 45 fc mov %al,-0x4(%ebp)
80483f9: b8 01 00 00 00 mov $0x1,%eax
80483fe: c9 leave
80483ff: c3 ret
08048400 <_Z4testi>:
8048400: 55 push %ebp
8048401: 89 e5 mov %esp,%ebp
8048403: b8 64 00 00 00 mov $0x64,%eax
8048408: 5d pop %ebp
8048409: c3 ret
注意事项(坑点):1、函数重载,返回值类型是不参与重载的。并且最坑的是如果你依照返回值类型不同用到了一个重载函数,尽管这个函数是不存在的,链接器也是无法捕获这样的错误,怎么理解呢,看下面的例子:
root@ubuntu:/home/qpz# g++ -c main.cpp
root@ubuntu:/home/qpz# nm main.o
00000000 T main
U _Z4testb
root@ubuntu:/home/qpz# c++filt U _Z4testb
U
test(bool)
可以看到目标文件仍然依赖U _Z4testb这个符号。这样就会发生一些不可预知的错误,特别是函数的返回类型是自定义类型的时候