开始接触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