_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,
所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式
。VC将函数编译后会在函数名前面加上下划线前缀。
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压
栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在
函数名后加上"@"和参数的字节数。
_fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上"@"前
缀,在函数名后加上"@"和参数的字节数。
一篇文章from vckbase
__stdcall和_cdecl
(xulion发表于2001-8-21 10:28:16)
[精彩文章]
这两个关键字看起来似乎很少和我们打交道,但是看了下面的定义(来自windef.h
),你一定会觉得惊讶:
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#define cdecl _cdecl
#ifndef CDECL
#define CDECL _cdecl
#endif
几乎我们写的每一个WINDOWS API函数都是__stdcall类型的,为什么??
首先,我们谈一下两者之间的区别:
WINDOWS的函数调用时需要用到栈(STACK,一种先入后出的存储结构)。当函数
调用完成后,栈需要清楚,这里就是问题的关键,如何清除??
如果我们的函数使用了_cdecl,那么栈的清除工作是由调用者,用COM的术语来讲
就是客户来完成的。这样带来了一个棘手的问题,不同的编译器产生栈的方式不尽相同
,那么调用者能否正常的完成清除工作呢?答案是不能。
如果使用__stdcall,上面的问题就解决了,函数自己解决清除工作。所以,在跨
(开发)平台的调用中,我们都使用__stdcall(虽然有时是以WINAPI的样子出现)。
那么为什么还需要_cdecl呢?当我们遇到这样的函数如fprintf()它的参数是可变
的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行
,因此,这种情况我们只能使用_cdecl。
到这里我们有一个结论,如果你的程序中没有涉及可变参数,最好使用__stdcal
l关键字
分享到:
相关推荐
_stdcall、_cdecl和_fastcall 的区别.zip
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是...
关于函数调用方式__stdcall和__cdecl详解 __stdcall __cdecl 两者的相同点与不同点 实例 __stdcall __stdcall的全称是standard call。是C++的标准调用方式。 函数参数的入栈顺序为从右到左入栈。函数返回时使用retn ...
__stdcall 和 __cdecl 的区别浅析,需要的朋友可以参考一下
TEST DLL (__stdcall) 主要测试生成动态链接库与调用
说明了 stdcall 与 cdecl 的区别
1. 从右到左入栈:__stdcall、__cdecl、__thiscall(都是两个下划线) 2. 从左到右入栈:__pascal、__fastcall(都是两个下划线) 堆栈清理: 1. 调用者清除栈 2. 被调用函数返回后清楚栈 _stdcall是Wind32 API函数绝大...
易语言cdecl回调处理源码,cdecl回调处理,stdcall_to_cdecl,stdcall_to_cdecl_free,回调函数,test,VirtualAlloc,VirtualFree,set_data
stdcall的用法详解,常见的调用约定有:stdcall,cdecl,fastcall,thiscall,naked call
在没有其他插件作用的情况下生成的函数都是__stdcall约定,导致了在C++等环境隐式调用dll(即使用.lib文件)时,声明成__cdecl则函数会被平两次栈,声明成__stdcall又无法通过编译。 本程序可以自动修改黑月的def文件...
c++中调用的多种形式,_stdcall,_cdecl,_fastcall,thiscall, naked call
包含 Java 通过 RXTXComm 读写串口数据需要的动态链接库:SuperComSCL2008.Dll、rxtxSerial.dll、rxtxParallel.dll 和操作 SCL2008 显示屏的动态链接库 SCL_API_stdcall.dll、SCL_API_cdecl.dll
windows系统调用函数的方法有3种:__stdcall , __cdecl ,PASCAL 前两种是从右向左传递参数,最后一种是从左向右传递参数. __stdcall是windows系统调用API的标准方式 __cdecl是ANSI-C的标准调用方式
实际上__cdecl和__stdcall函数参数都是从右到左入栈,它们的区别在于由谁来清栈,__cdecl由外部调用函数清栈,而__stdcall由被调用函数本身清栈, 显然对于可变参数的函数,函数本身没法知道外部函数调用它时传了...
顺便再讲下关于调用约定和函数符号的关系,即_stdcall,_cdecl.还有就是extern “c”对函数名符号的影响。 上面的Dll1.dll的导出头文件如下: #pragma once extern "C" { //extern "C" + _stdcall,函数导出符号为 _...
stdcall cdecl 函数调用方式详解
_cdecl、_stdcall、_fastcall和_thiscall整理
vb6.0 __stdcall函数内调用__cdecl函数