函数调用约定1

来源:互联网 发布:数据质量自查报告 编辑:程序博客网 时间:2024/04/19 10:30

1、__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:

  1.参数传递顺序

  2.调用堆栈由谁(调用函数或被调用函数)清理

  常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

  __stdcall表示

  1.参数从右向左压入堆栈

  2.函数被调用者修改堆栈

  3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

  在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。

 

__stdcall自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。 int f(void *p) -->> _f@4(在外部汇编语言里可以用这个名字引用这个函数) .

 

2、 C调用约定(即用__cdecl关键字说明)(The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(如printf)只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。

原创粉丝点击