WINAPI和CALLBACK这两个宏有什么区别

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
WINAPI和CALLBACK这两个宏有什么区别呢?

_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?



首先看MSDN里给出的解释,不过有些语焉不详哦

WINAPI
·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API entry points, you can use this for your own APIs.

CALLBACK
·Use in place of FAR PASCAL in application callback routines such as window procedures and dialog procedures.

再看看到底这两个宏的内容是什么吧

VC:WINDEF.h
#define CALLBACK    PASCAL //=_pascal,VC已经不支持直接使用_pascal了
#define WINAPI      CDECL //=_cdecl

BCB:windef.h
#define CALLBACK    __stdcall
#define WINAPI      __stdcall

引出了cdecl stdcall等一些可能很少见的关键字

那么cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?
非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是
压入堆栈的内容由谁来清除,调用者还是函数自己?
这些开关用来告诉编译器产生什么样的汇编代码。

下面把区别列表如下:

Directive Parameter order  Clean-up Passes parameters in registers?
register  Left-to-right   Routine   Yes
pascal   Left-to-right   Routine   No
cdecl   Right-to-left   Caller    No
stdcall   Right-to-left   Routine   No
safecall  Right-to-left   Routine   No

简单说明:

__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
        __stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__stdcall可以写成_stdcall。
        __fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall。


·特别说明
1. 在默认情况下,采用__cdecl方式,因此可以省略.
2. WINAPI一般用于修饰动态链接库中导出函数
3. CALLBACK仅用于修饰回调函数
4. 你可能已经发现,VC下和BCB下对WINAPI的定义不同,那么你至少理解了
   为什么不能直接从BCB下调用VC的dll的一个原因了。 
 
MFC学习--CallBack问题 使用__stdcall, 函数的调用就不在是调用者负责清空函数栈, 而是由函数自身. 更直白的说就是倒底是在被调用的函数中清理, 还是在调用的函数中清理. _cdecl则需要调用函数自身进行清理, 而这样就无法达到跨平台调用. 所以__stdcall_cdcel区分了处理堆栈时的责任归属. 比如传统windows程序的WinMain入口的定义:int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine 阅读详情

相关推荐

VC中回调函数(callback)深入解析

通过此文讲解,让希望学好vc的同学真正理解vc中回调函数的结构意义

Windows API编程01-详解第一个程序(超级详细)

简单介绍Windows API:Windows APIApplication Programming Interface)是Microsoft Windows平台的应用程序编程接口,其主要目的是让应用程序开发人员可以调用操作系统提供的一组例程功能,而无须考虑其底层的源代码实现及内部工作机制。API函数是构筑整个Windows框架的基石,它基于Windows的操作系统核心,上层是所有的Windows应用程序。简单来说,这些API接口就是函数,就像C语言调用的stdio.h中的函数一样。

smiler_D的博客 9492

VS2010+MFC 使用WinAPI实现串口通信

Win7x64下的MFC中不可调用MSCOMM控件。所以在MFC下使用WinAPI来实现串口通信,亲测可用。

windows的CALLBACK函数修饰符

参考:https://blog.csdn.net/zhang_hui_cs/article/details/8544001对栈的操作是汇编层面做的,C语言并没有对应的语句能够直接操作栈,C语言的标准库 #include <stdarg.h>中有几个函数可以从栈中取数,但是并不能释放(POP)栈typedef char* va_list; void va_start ( va_list ...

野生猿-群号1025127672 1573

Windows 的CALLBACK函数

         WINDOWS的CALLBACK类型定义指定了该函数是进入EXE中的外部入口点,也就是WINDOWS直接调用这个过程.       一般用户设计而WINDOWS调用的函数都定义为CALLBACK类型.调用时参数以类似Pascal的从右到左的顺序放入程序堆栈中,这种参数调用顺序与C语言的方法刚好相反.使用Pascal堆栈框架意味着由被调用过程而不是由调用者来清理堆栈.      如

qqwangbalu的专栏 2046

WindowsAPI与MFC

在早初系统开发时代,混乱无序天才创想是充斥于程序圈的,API的设想是一种封装:既然底层是混乱复杂的,能否提供一个简单些的开发用函数包给那些不够高大的应用软件开发者使用,要求简单清楚同时提供足够的功能服务。可以想到,当年使用过WindowsAPI 的开发人员都是完全满意、赞不绝口的。这两套设计可以说是windows成功的关键:它们简化了应用程序的开发,同时它们使混乱纷杂的系统开发理清了头绪,它们规范整洁的风格、强大的功能、简化实用的开发方法、又深深的吸引了一大批开发技术人员成为windows的忠实粉丝。

luj_1768的博客 461

WINAPICALLBACK两个有什么区别呢?

<br />WINAPICALLBACK两个有什么区别呢?<br /><br />_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?<br /><br /><br />首先看MSDN里给出的解释,不过有些语焉不详哦<br /><br />WINAPI <br />·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API ent

Dolly2012的专栏 712

WINAPICALLBACK两个有什么区别呢?还关于stdcallcdecl的区别

结果对于我这样一个普通程序员,估计那么点开销,不会去关注!关于需要Dll导出的class,需要加特别的API。 WINAPICALLBACK两个 _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCA

sh_chenjian的专栏 1069

WINAPICALLBACK区别

WINAPICALLBACK区别[转] _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported A...

aixi8485的博客 424

WINAPICALLBACK两个说开去- -(转)

WINAPICALLBACK两个有什么区别呢? _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing aDLL with

FlowShell的专栏 1383

WINAPICALLBACK两个【zt】

WINAPICALLBACK两个 WINAPICALLBACK两个有什么区别呢? _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing 

眼界决定世界 奋斗成就梦想 695

WINAPICALLBACK两个说开去

从bbs上看到有同学问这个问题,因此回答了这个帖子。 WINAPICALLBACK两个有什么区别呢?_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCAL in API declarations. If y

183

(转)STDAPI释义

对于一个初学者来说,对于如下函数定义,一定会有点迷惑。STDAPI DllGetClassObject(){} 也许你会问该函数定义中的STDAPI是什么东东。如果你对此迷惑,那我告诉你在WINNT.h文件中STDAPI定义如下: #define STDAPI EXTERN_C HRESULT STDAPICALLTYPE 在MSDN中STDAPICALLTYPE有如下定义:

qq_31209383的博客 1469

windows游戏编程 (一) 了解WinMain函数,创建一个信息框

参考《Windows游戏编程大师技巧》 1.创建工程 对于Vs2019, VS2017 1)桌面向导 2)选择桌面应用程序,空项目 2.代码如下: #define WIN32_LEAN_AND_MEAN //预编译指令 指示编译器不要包含MFC的内容 #include <Windows.h> #include <windowsx.h> /* #define WINAPI __stdcall #define CALLBACK __stdcall __st..

代码有点烂 556

6,VC里一些容易混淆的地方(转自VCMFC的BLOG)

VC里一些容易混淆的地方黄森堂(vcmfc)1.FALSE/TRUE与false/true的区别:  false/true是标准C++语言里新增的关键字,而FALSE/TRUE是通过#define,这要用途是解决程序在C与C++中环境的差异,以下是FALSE/TRUE在windef.h的定义:#ifndef FALSE#define FALSE 0#endif#ifndef TRU

femalelover的专栏 1694

--------------------------STDAPI释义-----------------------------------

对于一个初学者来说,对于如下函数定义,一定会有点迷惑。STDAPI DllGetClassObject(){} 也许你会问该函数定义中的STDAPI是什么东东。如果你对此迷惑,那我告诉你在WINNT.h文件中STDAPI定义如下: #define STDAPI EXTERN_C HRESULT STDAPICALLTYPE 在MSDN中STDAPICALLTYPE有如下定义:

qq_31209383的博客 889

MFC中CALLBACK,WINAPI区别联系

首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API entry points, you can use this for your own APIs. CALLBACK ·Use in place of F

叮叮福 872
上一篇: ASSERT的用法
下一篇: ASSERT与VERIFY宏的区别
ysr1980
博客等级 码龄23年 14粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值