c/c++函数名字修饰规则初探

本文探讨了C++支持函数重载而C语言不支持的原因,关键在于C/C++函数名字修饰规则的差异。C语言仅在函数名前加下划线,而C++的修饰规则更复杂,包含了参数列表的描述,使得重载成为可能。文章详细解释了各种调用约定,如_stdcall、_cdecl、_fastcall和_thiscall,以及它们在参数传递和堆栈维护上的不同。
摘要由CSDN通过智能技术生成

开始接触c++时,遇到的一个问题就是:为什么c++可以支持重载?而c语言却不可以?这个问题看似很简单,但是具体让你讲解的话,你可以问问自己,可不可以不加思考的道出一切缘由?如果不可以,那么恭喜你,这篇文章你看完之后,一定会懂得这是为什么,如果你明白,那么这篇文章你就不需要看了。

首先,这是由于c/c++函数名字在编译时的修饰规则不同,函数的名字修饰(Decorated Name)——编译器在编译期间创建的一个字符串,作用—用来找到函数的定义和声明。编译时会将函数名字进行修饰,是为了在链接时定位函数的具体位置,一般情况下,程序员是不需要知道函数的名字是怎样修饰的,因为这些工作,编译器会自动完成,但是有些时候,我们为了深入了解一些东西时,就必须掌握函数名字的修饰规则,就比如本文一开始提出的问题。

1.调用约定:

调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。
这种协议规定了该语言的函数中的参数传送方式(压栈/存放在某个寄存器中)、参数个数是否可变和由谁来恢复堆栈(调用者/函数本身)等问题。不同的语言定义了不同的调用约定。

2.c/c++编译时函数名字的修饰规则——遵循的调用约定:

_stdcall调用约定—-格式:_functionname@number(输出函数名前加上“”,函数名后加上“@”,然后在@符号后加上参数的字节数)。

_cdecl调用约定—–格式:_functionname(仅在函数名前加上“”即可)。

③__fastcall调用约定—格式:@functionname@number(在函数名前后各加上一个“@”,在最后再加上参数的字节数)。

注意:这里均不改变函数名字符的大小写,这和pascal调用约定不同,pascal调用约定函数名无任何修饰且全部大写。

④thiscall调用约定(c++特有的)

3.详细了解各个约定:

①__stdcall调用约定
i

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值