gpt4 book ai didi

c++ - 函数的签名

转载 作者:太空狗 更新时间:2023-10-29 20:05:47 28 4
gpt4 key购买 nike

我是初级程序员,刚开始学习 C++ 编程,

我看过一个叫做“函数重载”的特性,虽然我已经理解了代码级别的目的和实现,但我还没有理解它是如何在编译器级别实现的,即编译器如何区分具有相同名称的不同函数的签名,并且会

return-type func-name (data-type 1 , data-type-2);

将具有与

相同的签名
return-type func-name (data-type 2 , data-type-1);

同样的事情是否也适用于重载的构造函数?

最佳答案

编译器使用一种称为 name mangling 的技术.

简而言之,编译器将参数的数量和类型编码为写入目标文件的实际名称。维基百科文章中有一些关于该主题的示例,包括来自 C++ 的示例。

作为具体示例,我在 Mac 上使用 g++ 编译了以下 C++ 文件:

测试.cpp

int f(int x) {}

int f(double x, char y) {}

g++ -S test.cpp

这会生成汇编语言文件(略有删减):

测试.s

.globl __Z1fi
__Z1fi:
pushq %rbp
movq %rsp, %rbp
movl %edi, -4(%rbp)
leave
ret
.globl __Z1fdc
__Z1fdc:
pushq %rbp
movq %rsp, %rbp
movsd %xmm0, -8(%rbp)
movb %dil, -12(%rbp)
leave
ret

这里的重要部分是函数在汇编语言输出中被称为 __Z1fi__Z1fdc,链接器将看到它们。您可能可以推断出 f 是函数的名称,对于参数,我们有 i (int) 和 dc (double 和 char ).请注意,参数的顺序也是经过编码的!

现在想想如果你有会发生什么

int f(int x) {}
int f(int y) {}

就语言而言,这当然不是可接受的情况,因为无法解析像 f(10) 这样的调用。理论上,一种语言可以指定第二个声明替换第一个,但 C++ 不会这样做。这简直就是非法重载。

事实证明,名称修改实际上说明了为什么这应该是一个错误。编译器会尝试使用名称 __Z1fi 创建两个不同的函数(实际名称不是由语言定义的,而是依赖于编译器的)。我们不能在这个级别的程序中有两个同名的函数。

关于c++ - 函数的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11372476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com