C语言三种函数调用约定_cdecl与_stdcall及_fastcall详细讲解

C语言三种函数调用约定_cdecl与_stdcall及_fastcall详细讲解

在C语言中,函数调用约定(Function Call Convention)是指编程语言如何在调用函数时传参、返回值等一系列约定。C语言中常用的函数调用约定有三种:cdecl、stdcall和fastcall。本文将对这三种函数调用约定进行详细讲解。

cdecl调用约定

cdecl(C declaration)是C语言标准的一种函数调用约定。它的特点是函数的参数从右向左依次入栈,在函数返回之后由调用方负责清除栈中的参数。这种约定使用最为广泛,C语言的默认约定也是cdecl。

示例1

#include <stdio.h>
#include <conio.h>

int sum(int a, int b)
{
    return a + b;
}

void main()
{
    int a = 1, b = 2, c;
    c = sum(a, b);
    printf("%d + %d = %d\n", a, b, c);
    getch();
}

在上述示例中,函数sum采用的是默认的cdecl调用约定。函数的参数从右向左依次入栈,因此在main函数中调用sum函数时,先将b入栈,再将a入栈,最后执行函数调用。函数返回之后,由main函数负责从栈中清除参数。

stdcall调用约定

stdcall(standard call)是Windows API采用的一种函数调用约定。Windows API是Microsoft Windows操作系统提供的一组标准库,它的函数调用约定采用stdcall。

stdcall的特点是函数的参数从右向左依次入栈,在函数返回之后由被调用方负责清除栈中的参数。stdcall约定的函数调用规则在编译时已经确定,不需要在运行时去确定,因此执行效率比cdecl更高。

示例2

#include <windows.h>

int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    MessageBox(NULL,"Hello World!","Message",MB_OK);
    return 0;
}

在上述示例中,WinMain函数采用的是stdcall调用约定,该函数为Windows应用程序的入口函数,由Windows系统在启动应用程序时调用。

fastcall调用约定

fastcall是一种常见的调用约定,尤其在x86架构上使用较多。它的特点是将前两个或三个整数参数通过寄存器来传递,从而减少将参数写入栈的次数,提高函数调用效率。

fastcall调用约定根据编译器而有所不同。例如,在VC++中,fastcall规定将前两个整数参数通过寄存器ecx和edx传递,其余整数参数通过栈传递。

示例3

#include <stdio.h>
#include <conio.h>

int __fastcall sum(int a, int b, int c, int d)
{
    return a + b + c + d;
}

void main()
{
    int a = 1, b = 2, c = 3, d = 4, e;
    e = sum(a, b, c, d);
    printf("%d + %d + %d + %d = %d\n", a, b, c, d, e);
    getch();
}

在上述示例中,sum函数采用的是fastcall调用约定。前两个整数参数a和b通过寄存器ecx和edx传递,后两个整数参数c和d通过栈传递。函数返回之后由main函数负责从栈中清除参数。

总结

本文对C语言中常用的三种函数调用约定进行了详细的讲解,分别为cdecl、stdcall和fastcall。这三种调用约定都有各自的特点,在不同的应用场景下选择合适的调用约定可以提高程序的执行效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言三种函数调用约定_cdecl与_stdcall及_fastcall详细讲解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Win7系统无法创建休眠文件且提示错误代码0xc000007f的解决方法

    Win7系统无法创建休眠文件且提示错误代码0xc000007f的解决方法 问题描述 在 Win7 系统中,有时会出现无法创建休眠文件的情况,并且会提示错误代码 0xc000007f,导致无法使用计算机的休眠功能。这种情况可能会影响用户的使用体验,因此需要及时解决。 解决方法 方法一:修复系统文件 1.打开开始菜单,在搜索栏中输入“cmd”,然后右键单击“命令…

    C 2023年5月23日
    00
  • JS跨域交互(jQuery+php)之jsonp使用心得

    下面我为你讲解一下“JS跨域交互(jQuery+php)之jsonp使用心得”的完整攻略。 什么是跨域? 跨域(cross-origin)是指在当前请求资源(如 javascript、css、json、xml 等)的文档或脚本所属窗口(window、iframe 或 frame)与请求资源所在文档的域(domain)不同情况下的访问。 JSONP 原理 JS…

    C 2023年5月23日
    00
  • 关于VS+QT5应用程序换图标的解决方案

    关于VS+QT5应用程序换图标的解决方案,可以如下操作: 1. 原理介绍 QT5程序在编译后的exe文件的图标,并不是我们常见的.ico格式,而是.qrc格式。.qrc格式是QT资源文件的格式,里面包含了程序中需要用到的图像、音频等资源。所以,如果我们想要修改QT程序的图标,实际上就是需要修改资源文件中的图标。 2. 修改.res文件 (1)在项目中添加一个…

    C 2023年5月23日
    00
  • 详解编译器编译原理

    下面是详解编译器编译原理的完整攻略。 什么是编译器? 编译器是一种将源代码转换为目标代码的程序。源代码可以是任何一种高级语言,例如C、C++、Java等等,而目标代码则是汇编语言或机器语言。编译器有很多种,常见的有GCC、Clang等。 编译器的基本流程 编译器的基本流程分为三个阶段:词法分析、语法分析和代码生成。 1. 词法分析 词法分析阶段将源代码分解成…

    C 2023年5月23日
    00
  • C&C++设计风格选择 命名规范

    C/C++设计风格选择 什么是代码风格 代码风格是指编写代码时所遵循的规范和习惯,它涉及到如下几个方面: 命名规则(变量名、函数名、常量名等) 缩进和布局(tab还是空格、括号位置等) 注释规则(注释的格式、位置等) 代码组织(使用头文件、源文件等) 恰当的代码风格可以使程序更加清晰明了,便于日后的维护和修改。 C/C++代码风格 C/C++是一种老牌编程语…

    C 2023年5月23日
    00
  • Shell在日常工作中的应用实践

    作者:京东物流 李光新 1 Shell可以帮我们做什么 作为一名测试开发工程师,在与linux服务器交互过程中,大都遇到过以下这些问题: •一次申请多台服务器,多台服务器需要安装相同软件,配置相同的环境,同样的操作需要重复多次; •工作中经常会使用命令行命令来完成我们的一些操作,但是有些命令使用率很高,而且很长,每次都全部敲进去势必会浪费很多时间(比如查日志…

    C语言 2023年4月22日
    00
  • C语言实现扫雷小游戏(扩展版可选择游戏难度)

    C语言实现扫雷小游戏(扩展版可选择游戏难度)攻略 整体思路 一、游戏界面及难度选择 在开始游戏前,首先需要让玩家选择游戏难度,根据不同的难度生成不同数量的地雷。可以使用 printf() 函数输出提示信息,再使用 scanf() 函数获取用户选择。 然后,显示游戏界面,包括地图、标记、已扫描的方块等信息,需要使用 printf() 函数将这些信息渲染到控制台…

    C 2023年5月22日
    00
  • C程序 检查一个数字是否为 Palindrome

    首先,需要明确Palindrome的定义:一个数字是Palindrome,当且仅当它的数字顺序倒过来后仍然相同。例如,121是Palindrome,而123不是Palindrome。 接下来,我们来介绍如何在C程序中检查一个数字是否为Palindrome。以下是完整的使用攻略: 步骤一:将数字转化为字符串 我们需要将要检查的数字转化为字符串,然后才能进行后续…

    C 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部