iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C和C++的函数调用方式是什么
  • 520
分享到

C和C++的函数调用方式是什么

2023-06-29 09:06:25 520人浏览 薄情痞子
摘要

这篇文章主要介绍C和c++的函数调用方式是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!调用方式C/C++函数有多种调用约定。C语言:__cdecl__stdcall__fastcallnaked__pascal

这篇文章主要介绍C和c++的函数调用方式是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

调用方式

C/C++函数有多种调用约定。

C语言:

  • __cdecl

  • __stdcall

  • __fastcall

  • naked

  • __pascal

C++比C语言多了一种:

__thiscall

1. __cdecl

__cdecl调用约定又称为C调用约定,时C/C++语言缺省的调用约定。参数按照从右向左的方式入栈,函数本身不清理栈,此工作由调用者负责,返回值在EAX中。
由于由调用者清理站,所以允许可变参函数存在。

图示:

int __cdecl add(int a, int b){int c = a + b;return c;}int main(void){int x = 1, y = 2;int z = add(x, y);return 0;}

C和C++的函数调用方式是什么

函数本身不清理栈,此工作由调用者负责

C和C++的函数调用方式是什么

2. __stdcall

参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。

示例:

int __cdecl add(int a, int b){int c = a + b;return c;}int main(void){int x = 1, y = 2;int z = add(x, y);return 0;}

C和C++的函数调用方式是什么
C和C++的函数调用方式是什么

3. __fastcall

顾名思义,__fastcall 的特点就是快,因为它通过CPU寄存器来传递参数。他用ECX和EDX传送前两个双字(DWord)或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。

4. naked

naked是一个很少见的调用约定,一般不建议使用。编译器不会给这种函数增加初始化和清理代码,更特殊的是你不能用return返回返回值,只能用插入汇编返回结果,此调用约定必须跟_declspec同时使用。例如定义一个求和程序,如:_declspec (naked) int add(int a,int b) ;

5. __pascal

这是pascal语言的调用约定,跟_stdcall一样,参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。VS 中已经废弃了这种调用方式,因此在写VS程序时,建议使用_stdcall 代替。

6. __thiscall

这是C++语言特有的一种调用方式,用于类成员函数的调用约定。如果参数确定,this 指针存放于ECX 寄存器,函数自身清理堆栈;如果参数不确定,this 指针在所有参数入栈后再入栈,调用者清理栈。_thiscall 不是关键字,程序员不能使用。参数按照从右至左的方式入栈。

示例:

class Object{private:int value;int nums;public:Object(int x = 0, int y = 0){value = x;nums = y;}~Object() {}void Print()const{cout << value << endl;}};int main(void){Object obj(10, 20);obj.Print();return 0;}

C和C++的函数调用方式是什么

函数自身清理堆栈

C和C++的函数调用方式是什么

对象地址放入寄存器 ECX中

C和C++的函数调用方式是什么

名字修饰约定

1.修饰名

“C”或者“C++”函数在内部(编译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原型时生成的字符串。有些情况下使用函数的修饰名是必要的,如在模块定义文件里头指定输出“C++”重载函数、构造函数、析构函数,又如在汇编代码里调用“C””或“C++”函数等。

修饰名由函数名、类名、调用约定、返回类型、参数共同决定 。

2.名字修饰约定随调用约定和编译种类(C或C++)的不同而变化。

1.C编译时函数名修饰约定规则

_stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式:_functionname@number;如:_fun@4;

_cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式: _functionname。

_fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式: @functionname@number。

示例:

extern "C"{int __stdcall fun1(int a, int b) { return 0; }int __cdecl fun2(int a) { return 0; }int __fastcall fun3(int a) { return 0; }}int main(void){fun1(1, 1);fun2(2);fun3(3);return 0;}

C和C++的函数调用方式是什么

2.C++编译时函数名修饰约定规则

__stdcall调用约定:

以"?""标识函数名的开始,后跟函数名;

函数名后面以"@@YG"标识参数表的开始,后跟参数表;

参数表以代号表示:

代号类型
Xvoid
Dchar
Eunsigned char
Fshort
Hint
Iunsigned int
Jlong
Kunsigned long
Mfloat
Ndouble
_Nbool
PA指针

PA表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"o"代替,一个"O"代表一次重复;

参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;

参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。

示例:

extern "C++"{void __stdcall fun(int a) { return 0; }int __cdecl fun(int a, int b) { return 0; }int __fastcall fun() { return 0; }}int main(void){fun(1);fun(2, 3);fun();return 0;}

C和C++的函数调用方式是什么

以上是“C和C++的函数调用方式是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C和C++的函数调用方式是什么

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C和C++的函数调用方式是什么
    这篇文章主要介绍C和C++的函数调用方式是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!调用方式C/C++函数有多种调用约定。C语言:__cdecl__stdcall__fastcallnaked__pascal...
    99+
    2023-06-29
  • c++中函数的调用方式
    c++ 中有两种函数调用方式:值调用和引用调用。值调用传递参数副本,不影响原始变量;引用调用传递参数引用,修改引用会影响原始变量。根据函数目的和效率考虑,选择适当的调用方式:值调用保护原...
    99+
    2024-05-06
    c++
  • c语言调用子函数的方法是什么
    在C语言中,调用子函数的方法可以通过以下步骤实现:1. 首先,在主函数或其他需要调用子函数的函数中,声明子函数的原型。原型包括子函数...
    99+
    2023-10-08
    c语言
  • c语言子函数调用的方法是什么
    在C语言中,可以使用以下两种方法调用子函数:1. 值传递(Call by Value):将实参的值复制给形参,子函数中对形参的修改不...
    99+
    2023-09-13
    c语言
  • c++函数调用的方式有哪些
    C++函数可以通过以下方式调用:1. 直接调用:使用函数名、参数列表和分号来调用函数。2. 函数指针调用:将函数的地址保存在指针变量...
    99+
    2023-08-18
    c++
  • C#调用C++动态库接口函数和回调函数方法
    目录1. 前言2. 普通接口函数调用示例2.1 C++端编写接口2.2 C#端调用3. 回调函数调用示例3.1 C++端编写接口3.2 C#端调用1. 前言 需求: 当前C已经写好了...
    99+
    2024-04-02
  • C++函数调用与Struct和CLass的区别是什么
    本篇内容介绍了“C++函数调用与Struct和CLass的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、结构回顾结构:自定义的...
    99+
    2023-06-30
  • c语言函数的递归调用方法是什么
    C语言函数的递归调用方法是指在函数内部调用自身的过程。递归调用函数可以让程序重复执行相同的操作,直到满足某个条件才停止。递归调用函数...
    99+
    2023-09-04
    c语言
  • C语言函数调用的作用是什么
    C语言函数调用的作用是将程序的执行过程分割成更小的可重用模块,提高代码的可读性和可维护性。函数调用可以将一组操作封装到一个函数中,并...
    99+
    2023-09-13
    C语言
  • C++中有哪些函数调用的方式
    这篇文章将为大家详细讲解有关C++中有哪些函数调用的方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学...
    99+
    2023-06-17
  • C++ 函数的变长参数的使用方式是什么?
    c++++ 中变长参数函数允许接收数量可变的参数。其语法为:returntype function_name(type1 arg1, type2 arg2, ..., typen arg...
    99+
    2024-04-19
    c++ 变长参数
  • c语言函数的定义与调用方法是什么
    C语言函数的定义和调用方法如下:1. 函数的定义:在C语言中,函数的定义包括函数的返回类型、函数名、参数列表和函数体。函数的定义一般...
    99+
    2023-08-18
    c语言
  • 怎样解析C++函数调用方式
    本篇文章给大家分享的是有关怎样解析C++函数调用方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在C++语言中进行C++函数调用时,C++中的虚函数的作用主要是实现了多态的机...
    99+
    2023-06-17
  • C语言函数的调用原理是什么
    C语言函数的调用原理是通过栈来实现的。当一个函数被调用时,系统会为该函数分配一块内存空间,这块空间被称为栈帧。栈帧包含了函数的参数、...
    99+
    2023-09-04
    C语言
  • C#怎么调用C++动态库接口函数和回调函数
    本文小编为大家详细介绍“C#怎么调用C++动态库接口函数和回调函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么调用C++动态库接口函数和回调函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 前言...
    99+
    2023-06-29
  • C调用C++代码的方法是什么
    这篇文章主要介绍“C调用C++代码的方法是什么”,在日常操作中,相信很多人在C调用C++代码的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C调用C++代码的方法是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-25
  • c++中的函数调用有哪几种方式
    c++ 函数调用方式有五种:值传递、引用传递、指针传递、返回值、虚函数调用。值传递传递副本,不会影响实际参数;引用传递传递引用,修改参数会影响实际参数;指针传递传递地址,修改参数会影响实...
    99+
    2024-05-01
    c++
  • C++调用动态库和Python调用C++动态库的方法是什么
    这篇文章主要介绍“C++调用动态库和Python调用C++动态库的方法是什么”,在日常操作中,相信很多人在C++调用动态库和Python调用C++动态库的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-05
  • C++对全局函数的处理方式是什么
    这篇文章主要介绍“C++对全局函数的处理方式是什么”,在日常操作中,相信很多人在C++对全局函数的处理方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++对全局函数的处理方式是什么”的疑惑有所帮助!...
    99+
    2023-06-17
  • C++11 成员函数作为回调函数的使用方式
    目录C++11成员函数作为回调函数使用示例1示例2类成员函数作为回调函数的方法及注意点类成员函数当回调函数的方法为什么回调函数必须为静态函数?类的静态成员函数如何访问非静态成员?C+...
    99+
    2022-11-13
    C++11 成员函数 C++11 回调函数 使用回调函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作