_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 相比,主要区别在于参数的清理工作由被调用者完成。 #### 关键特性: - **参数压栈顺序**:从右至左。 - **堆栈清理**:由被调用者负责。 - **返回值**:返回值同样存储在 EAX 寄存器中。 - **修饰名...
本文将详细讲解两种常见的函数调用约定:__stdcall和__cdecl。 首先,__stdcall是C++中的标准调用方式,它的主要特征是参数从右到左入栈,即参数在函数调用时逆序放入堆栈。当函数返回时,使用`retn x`指令来清理...
总结来说,`__stdcall` 和 `__cdecl` 的主要区别在于参数压栈的顺序和栈的清理责任。`__cdecl`是调用者清理栈,更灵活,适用于通用的函数;而`__stdcall`是被调用者清理栈,更高效,通常用于API函数或性能关键的代码...
__stdcall、__cdecl和__fastcall各有优势和应用场景,选择合适的调用约定对于优化代码性能和提高程序的可维护性至关重要。了解这些调用约定的具体细节有助于开发者更好地理解底层机制,并能够根据项目需求做出最佳...
标题中的“TEST DLL (__stdcall)”指的是一个关于创建和使用使用`__stdcall`调用约定的动态链接库(DLL)的技术主题。在Windows操作系统中,DLL是一种可共享的代码库,程序可以在运行时调用其中的函数来实现特定...
### _stdcall与其它调用约定的区别 - **cdecl**:参数同样是从右到左压栈,但由被调用者清理栈空间。 - **fastcall**:前两个32位或64位的参数分别存储在ECX和EDX寄存器中,其余参数从右到左压栈,由调用者清理栈...
stdcall调用约定是默认的调用约定,但也可以使用cdecl调用约定。 2. CharSet字段:该字段用于控制字符串参数的传递方式。如果CharSet字段设置为Unicode,则字符串参数将被转换为Unicode字符열;如果CharSet字段设置...
易语言cdecl回调处理源码,cdecl回调处理,stdcall_to_cdecl,stdcall_to_cdecl_free,回调函数,test,VirtualAlloc,VirtualFree,set_data
"stdcall介绍" stdcall 调用约定是高级语言中的一种函数调用约定,用于解决函数调用时参数传递问题。...stdcall 调用约定和 cdecl 调用约定都是高级语言中常用的函数调用约定,它们的特点和使用方法都是非常不同的。
总结来说,stdcall和cdecl的主要区别在于参数清理的责任方:stdcall由被调用者负责,cdecl由调用者负责。选择哪种调用约定取决于具体的应用场景,通常系统级接口、API函数倾向于使用stdcall以提高效率,而一般的C/...
接下来,我们将通过具体的示例代码来进一步分析`__stdcall`和`__cdecl`的区别: ```c #include "stdio.h" // __stdcall 示例 void __stdcall f_stdcall(int a, int b) { int c; c = a + b; } // __cdecl 示例 ...
通过对 `_stdcall` 和 `_cdecl` 两种调用约定的深入探讨,我们可以看出它们之间的主要区别在于栈的清理责任归属。选择合适的调用约定不仅可以提高代码的性能,还能确保跨平台或跨语言调用的一致性和稳定性。在实际...
本文将深入探讨三种常见的函数调用约定:`__stdcall`、`__cdecl` 和 `__fastcall`,并对比它们的特点和适用场景。 首先,`__cdecl` 是C语言默认的调用约定,也是大多数编译器默认使用的约定。在`__cdecl`中,函数的...
在没有其他插件作用的情况下生成的函数都是__stdcall约定,导致了在C++等环境隐式调用dll(即使用.lib文件)时,声明成__cdecl则函数会被平两次栈,声明成__stdcall又无法通过编译。 本程序可以自动修改黑月的def文件...
### stdcall 与 cdecl:函数调用方式详解 在编程领域,特别是在C和C++语言中,函数调用约定(Calling Convention)是一个重要的概念。它规定了如何传递参数、谁来清理栈空间以及如何处理返回值等细节。本文将详细...
C++builder调用VCdll.pdf 本文档详细介绍了C++builder调用VC编写的DLL的过程,并对__cdecl、__fastcall、__stdcall三种调用...同时,我们也可以了解到__cdecl、__fastcall、__stdcall三种调用约定的区别和使用方法。
在Linux系统中,生成动态库(Dynamic Library)是软件开发中的常见步骤,特别是在嵌入式领域,如ARM架构的设备。动态库可以被多个程序共享,节省内存资源,提高系统效率。以下是一个详细的步骤,说明如何在Linux环境...