首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Windows上的__cdecl或__stdcall?

在Windows上,cdecl和stdcall是函数调用约定(calling convention)的两种形式。

cdecl是一种标准的C语言调用约定,它将函数的参数从右向左依次压入栈中,由调用者负责清理栈上的参数。这种调用约定适用于可变参数函数和回调函数,但由于参数清理的责任由调用者承担,因此在函数调用时会产生较多的代码。在使用cdecl调用约定时,函数名不会被修饰。

stdcall是一种被广泛使用的调用约定,它将函数的参数从右向左依次压入栈中,由被调用函数负责清理栈上的参数。这种调用约定适用于大多数的Windows API函数和COM接口函数,因为参数清理的责任由被调用函数承担,所以在函数调用时会产生较少的代码。在使用stdcall调用约定时,函数名会被修饰,通常以@符号结尾。

在选择使用cdecl还是stdcall时,需要根据具体的情况来决定。如果是与其他C代码进行交互或者是可变参数函数,可以选择cdecl。如果是调用Windows API函数或者COM接口函数,应该选择stdcall。

以下是腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

5.5 汇编语言:函数调用约定

而如果栈在使用结束后没有恢复过度恢复,则会造成栈上溢下溢,给程序带来致命错误。...一般情况下在Win32环境默认遵循就是STDCALL,而在Win64环境下使用则是FastCALL,在Linux系统则遵循SystemV约定,这里我整理了他们之间异同点....CDECL:C/C++默认调用约定,调用方平栈,不定参数函数可以使用,参数通过堆栈传递. STDCALL:被调方平栈,不定参数函数无法使用,参数默认全部通过堆栈传递....通过以上分析发现_cdecl与_stdcall两者只在参数平衡上有所不同,其余部分都一样,但经过优化后_cdecl调用方式函数在同一作用域内多次使用,会在效率比_stdcall髙,这是因为_cdecl...,只不过在寻址方式要使用二维数组寻址公式,此外传递数组其实本质就是传递指针,所以数组与指针传递方式也是相通

26620
  • 2020-09-04:函数调用约定了解么?

    福哥答案2020-09-04: 初级回答: stdcallcdecl两者参数传递顺序都是从右向左。...cdecl在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈,每一个调用它函数都包含清空堆栈代码,所以产生可执行文件大小会比调用_stdcall函数大。...__cdecl 在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈。 函数实参在线程栈按照从右至左顺序依次压栈。...实际__fastcall用ECX和EDX传送前两个DWORD更小参数,剩下参数仍自右向左压栈传送,被调用函数在返回前清理传送参数内存栈。...此调用约定常见在如下16-bit 平台编译器:OS/2 1.x,微软Windows 3.x,以及Borland Delphi版本1.x。 7.

    59910

    linux 编译 ccpp 文件为动态库 so 文件(最简单直观模板)

    注:在linux,源文件函数方法前,不需要声明 __declspec(dllexport) 在WIn32才需要。...带有可变参数函数必须且只能使用_cdecl方式 __cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数压栈顺序...1、__stdcall调用约定:函数参数自右向左通过栈传递,被调用函数在返回前清理传送参数内存栈。 2、__cdecl是C和C++程序缺省调用方式。...3、__fastcall调用约定:它是通过寄存器来传送参数(实际,它用ECX和EDX传送前两个双字(DWORD)更小参数,剩下参数仍旧自右向左压栈传送,被调用函数在返回前清理传送参数内存栈...__declspec(dllimport)用于Windows中,从别的动态库中声明导入函数、类、对象等供本动态库exe文件使用。

    5.7K40

    5.5 汇编语言:函数调用约定

    而如果栈在使用结束后没有恢复过度恢复,则会造成栈上溢下溢,给程序带来致命错误。...一般情况下在Win32环境默认遵循就是STDCALL,而在Win64环境下使用则是FastCALL,在Linux系统则遵循SystemV约定,这里我整理了他们之间异同点.CDECL:C/C++...通过以上分析发现_cdecl与_stdcall两者只在参数平衡上有所不同,其余部分都一样,但经过优化后_cdecl调用方式函数在同一作用域内多次使用,会在效率比_stdcall髙,这是因为_cdecl...但是,由于FASTCALL约定使用寄存器数量比CDECLSTDCALL约定多,因此它也有一些限制,例如不支持使用浮点数等实现中需要使用多个寄存器数据类型。...,只不过在寻址方式要使用二维数组寻址公式,此外传递数组其实本质就是传递指针,所以数组与指针传递方式也是相通

    32620

    函数调用三种约定,你都清楚吗

    __cdecl、__stdcall、__fastcall是C/C++里中经常见到三种函数调用方式。...其中__cdecl是C/C++默认调用方式,__stdcallwindows API函数调用方式,只不过我们在头文件里查看这些API声明时候是用了WINAPI宏进行代替了,而这个宏其实就是_...__stdcallwindows API默认方式,参数从右向左入栈,被调函数负责栈平衡。 __fastcall: 快速调用方式。...上图我们看到了__cdecl中由主调函数完成了,那么__stdcall呢,在被调函数Fun3()中,转向被调函数结尾处代码,我们看到了这一句: ? 那么Fun1()结尾处又是如何呢? ?...说完了__cdecl和__stdcall,再来看看__fastcall,如前面图看到调用时并未使用push指令向栈里传参数,而是使用了 mov edx, 5 mov ecx, 2 两条指令

    1.1K10

    python调用dll文件接口

    转载 在Python中某些时候需要C做效率补充,在实际应用中,需要做部分数据交互。...使用python中ctypes模块可以很方便调用windowsdll(也包括linux下so等文件),下面将详细讲解这个模块(以windows平台为例子),当然我假设你们已经对windows下怎么写一个...cdecl(这里强调调用约定是因为,stdcall调用约定和cdecl调用约定声明导出函数,在使用python加载时使用加载函数是不同,后面会有说明)调用约定导出函数Add。...   dll函数_stdcall 和 _cdeclstdcall是被调用者来进行栈处理, cdecl是调用者进行栈处理。...cdecl中每个调用者都要嵌入处理代码,所以代码量会大一些。 但为什么不都用stdcall

    5.5K40

    ndk C++ 编译器函数名修饰规则

    1、__stdcall调用约定:函数参数自右向左通过栈传递,被调用函数在返回前清理传送参数内存栈, 2、_cdecl是C和C++程序缺省调用方式。...3、__fastcall调用约定:它是通过寄存器来传送参数(实际,它用ECX和EDX传送前两个双字(DWORD)更小参数,剩下参数仍旧自右向左压栈传送,被调用函数在返回前清理传送参数内存栈...函数返回值不作特殊处理,它描述方式和函数参数一样,紧跟着 参数表开始标志,也就是说,函数参数表第一项实际是表示函数返回值类型。...宏观现象就是函数调用没有问题(因为参数传递顺序是一样),MakeFun也完成了自己功 能,只是函数返回后引发错误。...__cdecl function(int a,int b) //明确指出C调用约定 cdecl调用约定参数压栈顺序是和 stdcall是一样,参数首先由有向左压入堆栈。

    2K31

    函数调用约定

    本篇原创作者:Rj45 背景 在前面的文章中,可以发现无论是x86架构还是x64架构程序,其内部函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。...(x64架构程序在使用寄存器传参时候无需调整栈帧) 这种将函数参数顺序压入栈中以及进行栈帧调整现象叫做函数调用约定。...函数调用约定 1、类型 函数调用约定有三种类型,分别为: __cdecl __stdcall __fastcall 2、区别 _cdecl:是CC++默认函数调用方式,函数参数从右向左入栈,主调函数负责栈平衡..._stdcall:是Windows API默认方式,函数参数从右向左入栈,被调函数负责栈平衡。...其意思是,向堆栈中压入下一行程序地址,当在进入子程序后进行反向运动时候,可以恢复到原程执行下一条指令地址位置。

    1.9K50

    如何在Linux,MacWindows安装Git

    Git简介 [如何在Linux,MacWindows安装Git] Git是由Linus Torvalds为Linux内核设计开发。...本指南将介绍如何使用各自包管理器在GNU/Linux,Mac OS和Windows安装最新、稳定预打包版git。也可以在其他任何操作系统编译源代码安装Git。...安装Git 要在Windows安装Git,您需要从Git官网下载安装程序: 双击对应安装包名称,下载适用于您操作系统最新版安装程序: [1595-Git-Win-01.png] 选择 Run 开始安装...否则,在点击 Next 按钮之前,选中其他要安装组件: [1601-Git-Win-07.png] 点击 Next 以创建默认开始菜单文件夹,点击 Browse 以选择新文件夹位置: [1602...在此示例中,我们创建了新Git仓库: [1606-Git-Win-12.png] 输入仓库所在目录名称点击 Browse 以定位到已有目录: [1607-Git-Win-13.png] 一个空白

    3.3K20

    调用约定

    在使用IDAF5功能时经常能够看到函数签名中带有cdecl、fastcall等字样,这些就是调用约定。调用约定是通常是特定于语言、编译器和CPU,这里只简单了解一下主流调用约定。...C调用约定(cdecl)   x86体系结构许多C编译器使用默认调用约定叫做C调用约定(cdecl)。...标准调用约定(stdcall)   标准调用约定“标准”是由微软为自己调用约定所起名称stdcall得来。...微软对所有共享库(DLL)文件输出参数数量固定函数使用stdcall约定。 x86 fastcall调用约定 fastcall调用约定时stdcall约定一个变体。...fastcall规定: 能够将最多两个参数存放在寄存器中 传递给函数前两个参数将分别位于ECX和EDX寄存器中 剩余参数以类似于stdcall约定方式从右往左放入栈 C++调用约定(thiscall

    86040

    exe调用DLL方式

    如extern “c” __stdcall调用方式就会在原来函数名加上写表示参数符号,而extern “c” __cdecl则不会附加额外符号。...dll中函数在被调用时是以函数名函数编号方式被索引。这就意味着采用某编译器C++Name-Mangling方式产生dll文件可能不通用。因为它们函数名重命名方式不同。...分两步: 一,如果导出函数使用了extern”C” _cdecl,那么就不需要再重命名了,这个时候dll里名字就是原始名字;如果使用了extern”C” _stdcall,这时候dll中函数名被修饰了..._declspec(dllexport)用在dll,用于说明这是导出函数。而_declspec(dllimport)用在调用dll程序中,用于说明这是从dll中导入函数。...默认情况下VC使用是__cdecl函数调用方式,如果产生dll只会给C/C++程序使用,那么就没必要定义为__stdcall调用方式,如果要给Win32汇编使用(或者其他__stdcall调用方式程序

    2.6K10

    编写dll时,为什么有 extern “C”

    如extern “c” __stdcall调用方式就会在原来函数名加上写表示参数符号,而extern “c” __cdecl则不会附加额外符号。...dll中函数在被调用时是以函数名函数编号方式被索引。这就意味着采用某编译器C++Name-Mangling方式产生dll文件可能不通用。因为它们函数名重命名方式不同。...分两步: 一,如果导出函数使用了extern”C” _cdecl,那么就不需要再重命名了,这个时候dll里名字就是原始名字;如果使用了extern”C” _stdcall,这时候dll中函数名被修饰了..._declspec(dllexport)用在dll,用于说明这是导出函数。而_declspec(dllimport)用在调用dll程序中,用于说明这是从dll中导入函数。...默认情况下VC使用是__cdecl函数调用方式,如果产生dll只会给C/C++程序使用,那么就没必要定义为__stdcall调用方式,如果要给Win32汇编使用(或者其他__stdcall调用方式程序

    2.5K10

    CC++ 反汇编:关于函数调用约定

    一般编译器实现调用调用约定无外乎以下这几种: CDECL:C/C++默认调用约定,调用方平栈,不定参数函数可以使用,参数通过堆栈传递....STDCALL:被调方平栈,不定参数函数无法使用,参数默认全部通过堆栈传递. FASTCALL32:被调方平栈,不定参数函数无法使用,前两个参数放入(ECX, EDX),剩下参数压栈保存....而如果栈在使用结束后没有恢复过度恢复,则会造成栈上溢下溢,给程序带来致命错误。...stdcall 被调用者平栈: stdcallcdecl只在参数平衡上有所不同,其余部分都一样,但该约定不定参数函数无法使用。...cdecl调用方式函数在同一作用域内多次被调用,会在效率stdcall高一些,因为它可以使用复写传播优化,而stdcall在函数内平衡栈,无法使用复写传播优化。

    62810

    Python3补充知识点

    没有switch-case语句,查看官方文档说是可以用if-elseif-elseif代替,同时也用其他解决方案比较简单就是利用字典来实现同样功能。...; 两种最基本函数调用约定: cdecl : 规定了函数参数列表从右向左顺序入栈,并有函数调用者负责清理栈参数,在X86架构被C编译器广泛使用; #C语言形式: int python_rocks(...three) #x86汇编语言形式 (从右向左) push three push two push one call python_rocks add esp, 12 #每个参数占用四个字节空间 stdcall...模块三种不同动态库链接方式: 1.cdll():用于加载那些遵循cdecl标准函数调用约定链接库; 2.Windll():用于加载那些遵循从stdcall调用约定动态链接库,stdcall是微软Win32API...所使用原生调用约定; 3.Oledll():使用方法与windll完全类似,只是oledll会假定其载入函数会统一返回一个windows hresult错误编码,这些错误编码专门服务于微软COM(

    42020

    Python3补充知识点

    if-elseif-elseif代替,同时也用其他解决方案比较简单就是利用字典来实现同样功能。...; 两种最基本函数调用约定: cdecl : 规定了函数参数列表从右向左顺序入栈,并有函数调用者负责清理栈参数,在X86架构被C编译器广泛使用; #C语言形式: int python_rocks...three) #x86汇编语言形式 (从右向左) push three push two push one call python_rocks add esp, 12 #每个参数占用四个字节空间 stdcall...模块三种不同动态库链接方式: 1.cdll():用于加载那些遵循cdecl标准函数调用约定链接库; 2.Windll():用于加载那些遵循从stdcall调用约定动态链接库,stdcall是微软Win32API...所使用原生调用约定; 3.Oledll():使用方法与windll完全类似,只是oledll会假定其载入函数会统一返回一个windows hresult错误编码,这些错误编码专门服务于微软COM(

    60410
    领券