C++函数重载的一个小坑点

C++函数重载中,返回值类型不参与重载判断,仅依靠参数列表区分。即便误依赖返回值类型调用未定义的重载函数,链接器也无法捕获错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了实现函数重载,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这个符号。这样就会发生一些不可预知的错误,特别是函数的返回类型是自定义类型的时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值