stdcall和cdecl指定的是参数传递方式,跟地址空间是32位还是64位没有关系
stdcall参数传递方式,参数是反向入栈,被调用子程序
负责恢复堆栈指针。
cdecl参数传递方式,参数反向入栈,调用者负责恢复堆栈。这样可以
实现变长参数调用(如在printf中)
只要是使用堆栈的体系,应该都有这个参数传递方式的问题。也许别的平台在调用
方式上都比较一致,而不像x86那么混乱?
比如调用sub(a,b)
[stdcall]
main:
...
push b
push a
call sub
...
sub:
...
...
...
ret 16
[cdecl]
main:
...
push b
push a
call sub
add sp, 16
...
sub:
...
...
...
ret
*****
fastcall应该是要求用寄存器传参数,但实现和体系有关。这些关键字在
实现跨语言的调用时有用。windows api用的都是stdcall, 如果
搞错了传参方式,参数就无法正确传递。
另外,可以看这个地方,介绍了各种调用方式:
http://www.borland.com/techpubs/delphi/delphi5/oplg/procfunc.html
【 在 intron (内含子) 的大作中提到: 】
: stdcall,fastcall一定没有。
: 因为UNIX下都是32位线性指针,或是新型的64位指针。
: cdecl也没有。参数传送顺序均C语言顺序,即使是UNIX下的pascal,basic也是如此。
: 这个大概与当初UNIX是用C建造的历史有关。