__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;

程序比程序员更理解c语言! cdecl程序(分析c语言的声明

c语言的声明有时侯是很复杂的;比如int (*a[5])(int); 再比如:int*((*p)(int))(int);你能说明白它们的意思吗? 像这样的声明很容易把一般的程序员弄蒙逼的。 ...
  • mazheng1989
  • mazheng1989
  • 2012年02月29日 18:13
  • 6038

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

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

_thiscall与_cdecl调用方式

_thiscall与_cdecl调用方式有什么区别
  • My_heart_
  • My_heart_
  • 2016年05月27日 23:19
  • 685

【C/C++开发】__stdcall,__cdecl,__fastcall的区别

__stdcall和__cdecl的区别 __stdcall和__cdecl是两种函数名字修饰。(注意是连续的两个下划线) Windows上 windows上不管是C还是C++,默认使用...
  • LG1259156776
  • LG1259156776
  • 2016年10月25日 12:52
  • 1472

__stdcall与__cdecl函数调用的不同

ESP是栈顶指针 Extended Stack Pointer EBP是基址指针 Extend Base Pointer ESP就是一直指向栈顶的指针,而EBP只是用于存取某时刻的栈顶指针,以...
  • chunyexiyu
  • chunyexiyu
  • 2015年04月15日 09:14
  • 1344

VC++环境下的调用约定:_cdecl _stdcall _fastcall thiscall

VC++环境下的调用约定:_cdecl  _stdcall  _fastcall  thiscall _cdecl     :属于VC++环境下的关键字,函数可以显示的声明为该调用方式,调用方负责...
  • duhaomin
  • duhaomin
  • 2014年02月21日 13:47
  • 1122

带你玩转Visual Studio——调用约定__cdecl、__stdcall和__fastcall

有一定C++开发经验的人一定对”__cdecl、__stdcall、__fastcall”肯定不陌生吧!但你真正理解了吗?是的,我曾在这采了无数个坑,栽了无数个跟头,终于忍无可忍要把它总结一下(虽然我...
  • luoweifu
  • luoweifu
  • 2016年09月03日 21:59
  • 3673

C专家编程:用python写cdecl程序,以分析C语言程序的声明语句

前两天阅读《C专家编程》第3章“分析C语言的声明”,书中提供了一个名叫 cdecl 的算法流程分析C语言声明。 输入C语言声明形式,用英语输出对应的描述。 我参照《C专家编程》“编程挑战”的设计,...
  • yyhustim
  • yyhustim
  • 2013年07月29日 09:56
  • 1014

__stdcall 与 __cdecl 区别 (汇编 call ret 时,栈的变化)

__cdecl C++ void fun(int a)   //默认__cdecl {  cout } int main() {  fun(3);  system("pause");  ret...
  • WMJ75617718
  • WMJ75617718
  • 2014年03月17日 00:35
  • 1448

无法解析的外部符号 "int __cdecl

定义全局函数,链接出错,请注意c全局函数定义规则 可如下定义 STDAPI InitialIscsi(); STDAPI 微软给出定义,相当于 extern “C”...
  • xuxinhua
  • xuxinhua
  • 2011年04月15日 21:41
  • 3748
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: __cdecl
举报原因:
原因补充:

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