C++中的函数调用一般针对三个问题:
1、参数传递的方式(是否采用寄存器传递参数、采用哪个寄存器传递参数、参数压桟的顺序等)
参数的传递方式,最常见的是通过栈传递。函数的调用方将参数压入栈中,函数自己再从栈中将参数取出。
对于有多个参数的函数,调用惯例要规定函数调用方将参数压栈的顺序,是从左往右还是从右往左。有些调用惯例还允许使用寄存器传递参数。
2、函数调用结束后的栈指针由谁恢复(被调用的函数恢复还是调用者恢复)
栈的维护方式:在函数将参数压栈之后,函数体 会被调用,此后需要将被压入的参数全部弹出,以使得栈在函数调用前后保持一致。这个弹出工作可以由函数的调用方来完成,也可以由函数本身完成。
3、函数编译后的名称;
名称修饰策略,为了链接的时候对调用惯例进行区分,调用惯例要对函数本身的名字进行修饰。不同的调用惯例有不同的名字修饰策略。
下面对几个经常使用的函数调用规则进行解释:
_stdcall
stdcall是standard call的缩写,也被称为pascal调用约定,因为pascal使用的函数调用约定就是stdcall。
使用stdcall的函数声明方式为:int _stdcall function(int a,int b)
stdcall的调用约定意味着:
1)采用桟传递全部参数,参数从右向左压入栈;
2)被调用函数负责恢复栈顶指针 ;
3) 函数名自动加前导的下划线,后面是函数名,之后紧跟一个@符号,其后紧跟着参数的尺寸,例如_TestFun@1&#x