stdcall 与 _cdecl 的区别
2010-04-30 00:12
337 查看
(1) __stdcall调用
__stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。
WIN32 Api都采用__stdcall调用方式,这样的宏定义说明了问题:
#define WINAPI __stdcall
按C编译方式,__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number。
(2) __cdecl调用
__cdecl是C/C++的缺省调用方式,参数采用从右到左的压栈方式,传送参数的内存栈由调用者维护。__cedcl约定的函数只能被C/C++调用,每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。
由于__cdecl调用方式的参数内存栈由调用者维护,所以变长参数的函数能(也只能)使用这种调用约定。
由于Visual C++默认采用__cdecl 调用方式,所以VC中中调用DLL时,用户应使用__stdcall调用约定。
按C编译方式,__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
(3) __fastcall调用
__fastcall调用较快,它通过CPU内部寄存器传递参数。
按C编译方式,__fastcall调用约定在输出函数名前面加“@”符号,后面加“@”符号和参数的字节数,形如@functionname@number。
(4)结论,如果你的程序中没有涉及可变参数,最好使用__stdcall关键字。
相关文章推荐
- __stdcall 和 __cdecl 的区别
- WINBASEAPI 与WINAPI(__stdcall __cdecl)的区别
- _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?
- _stdcall,_cdecl区别
- cdecl, stdcall, pascal,fastcall 都有什么区别,具体是什么调用约定?
- _stdcall与_cdecl的区别
- _stdcall与_cdecl的区别(ZZ)
- __stdcall,__cdecl,_cdecl,_stdcall,__fastcall,_fastcall 区别简介
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- _stdcall和_cdecl和_fastcall的区别
- _stdcall,_cdecl区别
- 函数调用规范__cdecl和__stdcall的区别
- 函数调用的区别:_cdecl以及_stdcall
- cdecl、stdcall、fastcall、declspec 的用法和区别
- __stdcall,__cdecl,__fastcall的区别
- _stdcall,_cdecl区别
- __stdcall __cdecl的区别
- _stdcall和_cdecl的区别
- cdecl、stdcall、fastcall函数调用约定区别
- __cdecl,__fastcall, __stdcall 什么区别?