返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中有哪些函数调用的方式
  • 574
分享到

C++中有哪些函数调用的方式

2023-06-17 17:06:43 574人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关c++中有哪些函数调用的方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学

这篇文章将为大家详细讲解有关c++中有哪些函数调用的方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall。在Microsoft C++系列的C/C++编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINapi和CALLBACK。

  • C++对象布局及多态之虚成员函数调用

  • JNI对象在函数调用中的生命周期

  • javascript函数调用的四个规则

  • 分清继承关系中基类和子类构造函数调用顺

  • PHP editor函数调用可视化编辑器

stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸以上述这个函数为例,参数b首先被压栈,然后是参数a,函数调用function(1,2)调用处翻译成汇编语言将变成:


push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 保存堆栈指针mov eax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向aadd eax,[ebp + 0CH] 堆栈中ebp + 12处保存了bmov esp,ebp 恢复esppop ebpret 8

注意不同编译器会插入自己的汇编代码以提供编译的通用性,但是大体代码如此。其中在函数开始处保留esp到ebp中,在函数结束恢复是编译器常用的方法。从函数调用看,2和1依次被push进堆栈,而在函数中又通过相对于ebp(即刚进函数时的堆栈指针)的偏移量存取参数。函数结束后,ret 8表示清理8个字节的堆栈,函数自己恢复了堆栈。

cdecl调用约定

cdecl调用约定又称为C调用约定,是C语言缺省的调用约定,它的定义语法是: int function (int a ,int b) //不加修饰就是C调用约定int __cdecl function(int a,int b)//明确指出C调用约定

在写本文时,出乎我的意料,发现cdecl调用约定的参数压栈顺序是和stdcall是一样的,参数首先由有向左压入堆栈。所不同的是,函数本身不清理堆栈,调用者负责清理堆栈。由于这种变化,C调用约定允许函数的参数的个数是不固定的,这也是C语言的一大特色。对于前面的function函数,使用cdecl后的汇编码变成:

调用处push 1push 2call functionadd esp,8 注意:这里调用者在恢复堆栈被调用函数_function处push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 。

保存堆栈指针mov eax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向aadd eax,[ebp + 0CH] 堆栈中ebp + 12处保存了bmov esp,ebp 恢复esppop ebpret 注意,这里没有修改堆栈MSDN中说,该修饰自动在函数调用名前加前导的下划线,因此函数名在符号表中被记录为_function,但是我在编译时似乎没有看到这种变化。

关于C++中有哪些函数调用的方式就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: C++中有哪些函数调用的方式

本文链接: https://lsjlt.com/news/291149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中有哪些函数调用的方式
    这篇文章将为大家详细讲解有关C++中有哪些函数调用的方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学...
    99+
    2023-06-17
  • c++函数调用的方式有哪些
    C++函数可以通过以下方式调用:1. 直接调用:使用函数名、参数列表和分号来调用函数。2. 函数指针调用:将函数的地址保存在指针变量...
    99+
    2023-08-18
    c++
  • php中函数调用函数的方式有哪些
    这篇文章主要讲解了“php中函数调用函数的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中函数调用函数的方式有哪些”吧!直接调用最基本的方式调用函数是直接在代码中调用它。当你...
    99+
    2023-07-05
  • c++中的函数调用有哪几种方式
    c++ 函数调用方式有五种:值传递、引用传递、指针传递、返回值、虚函数调用。值传递传递副本,不会影响实际参数;引用传递传递引用,修改参数会影响实际参数;指针传递传递地址,修改参数会影响实...
    99+
    2024-05-01
    c++
  • oracle函数调用的方式有哪些
    在Oracle中,可以使用以下几种方式调用函数:1. 直接调用:可以通过使用函数名和参数列表直接调用函数。例如:`FUNCTION_...
    99+
    2023-09-28
    oracle
  • c++中函数的调用方式
    c++ 中有两种函数调用方式:值调用和引用调用。值调用传递参数副本,不影响原始变量;引用调用传递参数引用,修改引用会影响原始变量。根据函数目的和效率考虑,选择适当的调用方式:值调用保护原...
    99+
    2024-05-06
    c++
  • C++中函数传递的方式有哪些
    本篇文章为大家展示了C++中函数传递的方式有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。值传递:void fun(int x)  {  x +...
    99+
    2023-06-17
  • C++ 中函数调用约定有哪些?
    c++++ 中的调用约定定义了函数参数传递和返回值的方式,包括 cdecl、fastcall、thiscall 和 stdcall。实战中,stdcall 调用约定可用于加载和调用 dl...
    99+
    2024-04-12
    c++ 函数调用约定 linux typedef
  • C++ 中函数参数的传递方式有哪些?
    c++++ 中,传递给函数的参数可通过三种方式传递:传值传递(创建形参副本)、传引用传递(直接访问实参)、传指针传递(访问实参的内存地址)。根据函数行为和内存管理要求选择最佳传递方式,权...
    99+
    2024-04-12
    c++ 函数参数传递方式 作用域
  • C#调用接口的方式有哪些
    这篇“C#调用接口的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#调用接口的方式有哪些”文章吧。在用C#调用接...
    99+
    2023-07-02
  • C++ 函数调用约定有哪些?
    c++++ 中有四种函数调用约定:通过值传递、通过指针传递、通过引用传递和通过 rvo 传递。通过值传递传递参数的副本,通过指针传递传递参数的地址,通过引用传递传递参数的引用,而通过 r...
    99+
    2024-04-12
    c++ 函数调用约定
  • javascript调用函数的方法有哪些
    javascript中调用函数的方法有:1.使用函数调用形式调用;2.使用方法调用;3.使用apply动态调用;4.使用new间接调用;javascript中调用函数的方法有以下几种使用函数调用形式调用函数function f(x,y) {...
    99+
    2024-04-02
  • php调用函数的方法有哪些
    PHP调用函数的方法有以下几种:1. 直接调用函数:直接使用函数名来调用函数,例如`functionName();`2. 通过变量间...
    99+
    2023-08-16
    php
  • c++中的函数调用有哪几种方式?它们有什么区别
    c++ 中的函数调用方式有 4 种:值传递(复制实参值,不影响实参)、引用传递(传递实参地址,修改形参值会修改实参)、指针传递(传递实参指向的内存地址,修改指向的值会影响实参)、rval...
    99+
    2024-05-14
    c++
  • C++ 函数参数传递方式有哪些?
    在 c++++ 中,有四种参数传递方式:1. 传值(副本)2. 传引用 3. 传常引用 4. 传指针。传值和传引用用于修改原值,常引用用于只读访问,而传指针用于操作内存地址。 C++ ...
    99+
    2024-04-12
    c++ 函数参数传递
  • C语言中函数宏封装的方式有哪些
    本篇内容介绍了“C语言中函数宏封装的方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 函数宏介绍函数宏,即包含多条语句的宏定义,...
    99+
    2023-07-05
  • C++ 函数调试技巧有哪些?
    c++++ 函数调试技巧包括:1. 打印调试信息;2. 设置断点;3. 使用调试器;4. 错误处理。通过这些技巧,可以识别和解决函数中的问题,例如变量值或调用栈异常。 C++ 函数调试...
    99+
    2024-04-12
    c++ 函数调试
  • dubbo调用的方式有哪些
    Dubbo调用方式有以下几种: 同步调用:发送请求后,等待服务提供者返回结果后再返回。 异步调用:发送请求后,不等待服务提供...
    99+
    2023-10-22
    dubbo
  • webservice调用的方式有哪些
    有以下几种常见的方式可以调用webservice: SOAP(Simple Object Access Protocol):基于...
    99+
    2024-02-29
    webservice
  • css调用方式有哪些
    这篇文章主要为大家展示了“css调用方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css调用方式有哪些”这篇文章吧。什么是css层叠样式表:为网页标签...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作