stdcall 与 _cdecl 的区别

 

(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关键字

你可能感兴趣的:(c,api,dll,pascal,winapi)