`
fireDragonpzy
  • 浏览: 442564 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

几种函数调用方式

c++ 
阅读更多

几种函数调用方式

  __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。
  _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。
  PASCAL 是Pascal语言的函数调用方式,也可以在C/C++中使用,参数压栈顺序与前两者相反。返回时的清栈方式与_stdcall相同。
  _fastcall是编译器指定的快速调用方式。由于大多数的函数参数个数很少,使用堆栈传递比较费时。因此_fastcall通常规定将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。不同编译器编译的程序规定的寄存器不同。返回方式和_stdcall相当。
  _thiscall 是为了解决类成员调用中this指针传递而规定的。_thiscall要求把this指针放在特定寄存器中,该寄存器由编译器决定。VC使用ecx,Borland的C++编译器使用eax。返回方式和_stdcall相当。
  _fastcall 和 _thiscall涉及的寄存器由编译器决定,因此不能用作跨编译器的接口。所以Windows上的COM对象接口都定义为_stdcall调用方式。
  C中不加说明默认函数为_cdecl方式(C中也只能用这种方式),C++也一样,但是默认的调用方式可以在IDE环境中设置。
  带有可变参数的函数必须且只能使用_cdecl方式,例如下面的函数:
  int printf(char * fmtStr, ...);
  int scanf(char * fmtStr, ...);
  */几种调用约定的区别
编辑本段
几种调用约定的区别

  __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。
  1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,
  2、_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。
  3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。
  4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。
  5、nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。
编辑本段
名字修饰约定

  1、修饰名(Decoration name):"C"或者"C++"函数在内部(编译和链接)通过修饰名识别
  2、C编译时函数名修饰约定规则:
  __stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8
  __cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname。
  __fastcall调用约定在输出函数名前加上一个"@"符号,后面也是一个"@"符号和其参数的字节数,格式为@functionname@number。
编辑本段
设置方法

  1 可以直接在代码中写 __cdecl 等调用约定
  2 在MS-VC++6.0中,调用约定也可以通过工程设置:Setting...\C/C++ \Code Generation项进行选择,缺省状态为__cdecl。名字修饰约定。


摘自:http://baike.baidu.com/view/1280676.htm
分享到:
评论

相关推荐

    几种函数调用方式 asm ,disassemble

    几种函数调用的方式,关于函数调用的一些东西,选自 Hacker Disassembling Uncovered 里的一节 ,精简版..

    剖析C++函数调用约定

    Visual C/C++的编译器提供了几种函数调用约定,了解这些函数调用约定的含义及它们之间的区别可以帮助我们更好地调试程序。在这篇文章里,我就和大家共同探讨一些关于函数调用约定的内容。 Visual C/C++的编译器支持...

    DLL创建与函数调用规则

    详述函数调用规则及DLL创建, 但非细节,解释DLL的几种类型

    Visual C++中函数调用方式浅探

    我们知道在进行函数调用时,有几种调用方法,分为C式,Pascal式。在C和C++中C式调用是缺省的,除非特殊声明。二者是有区别的,下面我们用实例说明一下

    函数的几种调用机制

    主要介绍了c语言中函数的调用机制,有需要的话可以下载看看。如果涉及任何版权问题,请与本人联系。本人将立刻撤销资源。

    Matlab函数的几种定义方式

    几种Matlab函数定义: 1、函数文件+调用命令文件 2、函数文件+子函数 3、Inline 4、匿名函数 5、syms+subs 6、字符串+subs 7、直接通过@符号定义。

    C/C++函数调用的几种方式总结

    本篇文章主要是对C/C++函数调用的几种方式进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    c语言中函数调用的几个实例

    c语言函数调用 在C语言中,函数是一种重要的程序模块,可以将一段可重用的代码块封装起来,以便在程序的其他部分中被调用。函数的使用可以减少代码重复,提高程序的可读性和可维护性。 在C语言中,函数调用是通过...

    函数直接调用几种方法_loki_grandmotherxmb_函数直接调用_元编程_

    将函数调用方式在模板入参基础上再增加直接调用的callfn方式,包括了Dll模块及Function类的使用,支持MFC环境希望对你的开发有帮助

    JavaScript函数的4种调用方法详解

    这里所有的调用模式中,最主要的区别在于关键字 this 的意义,下面分别介绍这个几种调用形式。 本文主要内容: 1.分析函数的四种调用形式2.弄清楚函数中this的意义3.明确构造函对象的过程4.学会使用上下文调用函数 ...

    servlet调用的几种方式

    servlet调用的几种方式 共4类常用调用方式: 1、通过URL调用 2、通过提交表单 3、超链接 4 、JavaScript写一个函数,调用这个函数

    函数调用扩展_函数扩展_raysfrs_函数入口地址_functor_虚函数_

    说明了几种函数入口调用方式,并使用模板来扩展函数参数类型,完成功能性函数的较长时间里的扩展可能。希望对你的开发有帮助。

    python通过函数名调用函数的几种场景

    主要介绍了python通过函数名调用函数的几种场景,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下

    详解微信小程序的不同函数调用的几种方法

    主要介绍了微信小程序的不同函数调用的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    js函数调用的方式

    Js函数调用的方式有如下几种情况: (1)具名函数直接调用 代码如下:function foo() { } foo(); (2)匿名函数通过引用来调用 代码如下: fooRef = function() { }fooRef(); (3)没有引用的匿名函数调用1 代码如下:...

    一种静态的Java程序函数调用关系图的构建方法.pdf

    在程序理解中,函数之间的调用关系是程序理解研究的重要内容。一个函数往往代表了一种具体功能或问题求解的实现,构建出函数调用图有助于...以java语言为研究对象,介绍了几种函数调用图的构建方法,并比较了它们的优劣性。

    PB 调用webservice 几种方式

    pb11.5 版本

    Javascript调用函数方法的几种方式介绍

    1.func(),这是最直接最常见的调用方式,也符合一般人的思维逻辑,但是在某些情况下有一些不足,下面会解释。 2.(function(arg){})(window),匿名方法调用,在构造命名空间时比较有用,后面的括号中的参数与匿名方法...

    C语言中函数声明与调用问题

    假如函数在调用它之前定义... 您可能感兴趣的文章:深入理解C++中public、protected及private用法C/C++函数调用的几种方式总结浅析C语言中堆和栈的区别关于C语言中参数的传值问题浅谈C语言函数调用参数压栈的相关问题

Global site tag (gtag.js) - Google Analytics