__cdecl

原创 2007年09月21日 19:06:00
&nbs

HTML Tags and JavaScript tutorial



__cdecl





cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?
非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是
压入堆栈的内容由谁来清除,调用者还是函数自己?
这些开关用来告诉编译器产生什么样的汇编代码。

下面把区别列表如下:
Directive Parameter order  Clean-up Passes parameters in registers?
 register  Left-to-right   Routine   Yes
 pascal   Left-to-right   Routine   No
 cdecl   Right-to-left   Caller    No
 stdcall   Right-to-left   Routine   No
 safecall  Right-to-left   Routine   No
简单说明:
__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
        __stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__stdcall可以写成_stdcall。
        __fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall。 
·特别说明
1. 在默认情况下,采用__cdecl方式,因此可以省略.
2. WINAPI一般用于修饰动态链接库中导出函数
3. CALLBACK仅用于修饰回调函数
 


p;

cdecl程序 --来自C专家编程

  • 2009年07月20日 10:45
  • 3KB
  • 下载

stdcall与cdecl的区别-16.09.20

  • 2016年09月20日 22:49
  • 70KB
  • 下载

cdecl、stdcall、fastcall函数调用约定区别

在C语言中,假设我们有这样的一个函数:      int function(int a,int b)      调用时只要用result = function(1,2)这样的方式就可以使用这个...
  • dqjyong
  • dqjyong
  • 2012年09月26日 17:45
  • 838

cdecl(C语言声明解析器)

  • 2012年11月14日 08:39
  • 32KB
  • 下载

__thiscall 转 __cdecl 时的问题,关于函数指针

此段是xzp7772009本人所写: 在 类的成员函数 中, 有一个成员函数A 需要调用 该类中另一个 成员函数B,而成员函数中需要的是 B作为函数指针传入参数, 此情形如果处理不当,就会报类似...

函数调用规范__cdecl和__stdcall的区别

原作:葡萄架上的牵牛花 原地址:http://blog.bcchinese.net/happyjet/archive/2005/05/24/22545.aspx     __c...
  • Qsir
  • Qsir
  • 2017年08月08日 15:18
  • 81

visual studio的C/C++修饰名及调用约定(如__cdecl)

程序出链接错误的时候,经常看到lnk errorxxx:某某函数、某某变量找不到等等,里面的函数名通常都很难看明白,因为使用的是修饰名。 C 和 C++ 程序中的函数在内部通过其修饰名加以识别。修饰...
  • J_Jeff
  • J_Jeff
  • 2014年12月03日 10:37
  • 1369

【C/C++】关于编译修饰符__stdcall、__cdecl和__fastcall 的异同点和应用场景

__stdcall、__cdecl和__fastcall是三种函数调用协议,函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、编译器函数名的修饰规则等。如下图所示,可以在IDE环境中设定所有函...

用__declspec,__cdecl,__fastcall,__stdcall等关键字修饰的函数的参数压栈方式

文章转载至:http://blog.csdn.net/feixiaoxing/article/details/7521004 在编译器编译文件的时候,软件会根据程序本身的要求对函数作不同的压栈处理。...

__cdecl __fastcall与 __stdcall(转)

  Visual C++ Compiler Options可以指定的Calling Convention有 3种: /Gd /Gr /Gz 这三个参数决定了: 1.函数参数以...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: __cdecl
举报原因:
原因补充:

(最多只允许输入30个字)