`
lxr215
  • 浏览: 58784 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

_stdcall,_cdecl区别

阅读更多

_stdcall与_cdecl的区别[转]

_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关键字
0
0
分享到:
评论

相关推荐

    _stdcall、_cdecl和_fastcall 的区别.zip

    _stdcall、_cdecl和_fastcall 的区别.zip

    函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

    函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是...

    关于函数调用方式__stdcall和__cdecl详解

    关于函数调用方式__stdcall和__cdecl详解 __stdcall __cdecl 两者的相同点与不同点 实例 __stdcall __stdcall的全称是standard call。是C++的标准调用方式。 函数参数的入栈顺序为从右到左入栈。函数返回时使用retn ...

    __stdcall 和 __cdecl 的区别浅析

    __stdcall 和 __cdecl 的区别浅析,需要的朋友可以参考一下

    TEST DLL (__stdcall)

    TEST DLL (__stdcall) 主要测试生成动态链接库与调用

    stdcall与cdecl的区别-16.09.20

    说明了 stdcall 与 cdecl 的区别

    链接库知识锦集

    1. 从右到左入栈:__stdcall、__cdecl、__thiscall(都是两个下划线) 2. 从左到右入栈:__pascal、__fastcall(都是两个下划线) 堆栈清理: 1. 调用者清除栈 2. 被调用函数返回后清楚栈 _stdcall是Wind32 API函数绝大...

    易语言cdecl回调处理

    易语言cdecl回调处理源码,cdecl回调处理,stdcall_to_cdecl,stdcall_to_cdecl_free,回调函数,test,VirtualAlloc,VirtualFree,set_data

    stdcall介绍

    stdcall的用法详解,常见的调用约定有:stdcall,cdecl,fastcall,thiscall,naked call

    黑月def修复统一用__stdcall-易语言

    在没有其他插件作用的情况下生成的函数都是__stdcall约定,导致了在C++等环境隐式调用dll(即使用.lib文件)时,声明成__cdecl则函数会被平两次栈,声明成__stdcall又无法通过编译。 本程序可以自动修改黑月的def文件...

    C++调用的多种形式

    c++中调用的多种形式,_stdcall,_cdecl,_fastcall,thiscall, naked call

    串口、SCL2008需要的动态链接库.dll,含64位和32位

    包含 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的标准调用方式

    浅谈C/C++中可变参数的原理

     实际上__cdecl和__stdcall函数参数都是从右到左入栈,它们的区别在于由谁来清栈,__cdecl由外部调用函数清栈,而__stdcall由被调用函数本身清栈, 显然对于可变参数的函数,函数本身没法知道外部函数调用它时传了...

    详解VS2019 dumpbin查看DLL的导出函数

    顺便再讲下关于调用约定和函数符号的关系,即_stdcall,_cdecl.还有就是extern “c”对函数名符号的影响。 上面的Dll1.dll的导出头文件如下: #pragma once extern "C" { //extern "C" + _stdcall,函数导出符号为 _...

    stdcall与 cdecl

    stdcall cdecl 函数调用方式详解

    函数调用约定

    _cdecl、_stdcall、_fastcall和_thiscall整理

    ceshi-master.zip

    vb6.0 __stdcall函数内调用__cdecl函数

Global site tag (gtag.js) - Google Analytics