由于参数按照从右向左顺序压栈,因此最开始的参数在最接近栈顶的位置,因此当采用不定个数参数时,第一个 参数在栈中的位置肯定能知道,只要不定的参数个数能够根据第一个后者后续的明确的参数确定下来,就可以使用不定参数,例如对于CRT中的sprintf函 数,定义为:
int sprintf(char* buffer,const char* format,……)
由于所有的不定 参数都可以通过format确定,因此使用不定个数的参数是没有问题的。
fastcall
fastcall调用约定和 stdcall类似,它意味着:
函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序 压栈
被调用函数清理堆栈
函数名修改规则同stdcall
其声明语法为:int fastcall function(int a,int b)
thiscall
thiscall是唯一一个不能明确指明的函数修饰,因为 thiscall不是关键字。它是C++类成员函数缺省的调用约定。由于成员函数调用还有一个this指针,因此必须特殊处理,thiscall意味着:
参数从右向左入栈
如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压栈后被压入堆 栈。
对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈。