__stdcall和__cdecl的问题

jet_const 2006-04-13 03:32:00
我们在VC中使用一些API函数时, windows采用的是__stdcall的调用方式
而我们自己写的函数默认是__cdecl的调用方式

那为什么在我们写的函数中调用API函数不会报错呢?

关于__stdcall和__cdecl, 感觉还有很多地方不是很理解, 希望大家能帮忙提供一些资料
...全文
177 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
what_016 2006-04-14
  • 打赏
  • 举报
回复
关注楼主最后提的问题!!!
jet_const 2006-04-14
  • 打赏
  • 举报
回复
谢谢大家提供的资料!

但是似乎还是没有解决: 为什么在我们写的函数中调用API函数不会报错呢?
nkwesley 2006-04-13
  • 打赏
  • 举报
回复
调用约定~
1、__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。

2、C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用__stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。是C、C++和MFC程序的缺省调用方式。
nkwesley 2006-04-13
  • 打赏
  • 举报
回复
http://www.blog.edu.cn/user2/shyyan/archives/2006/1098623.shtml
tong20037 2006-04-13
  • 打赏
  • 举报
回复
_stdcall将参数压栈是按C语言的顺序(从右到左),但与C 语言不同的是它是由被调用者将参数从栈中清除的,所以它的编译文件比_cdecl小。_stdcall是Windows API函数中默认的调用约定,VB、VFP等也采用这个约定。
_cdecl是C语言采用的默认调用方法,它的优点是支持printf这样的可变参数调用。
另外,VC++对于两种调用方法的名称转换方法也不同
sinsou 2006-04-13
  • 打赏
  • 举报
回复
以__stdcall方式调用的函数有以下特征:
参数由右至左压栈
调用返回时,堆栈由被调函数调整
__cdecl约定是C/C++函数的默认调用约定。它有以下特征:
参数由右至左压栈
调用返回时,堆栈由调用者调整
robin433 2006-04-13
  • 打赏
  • 举报
回复
关注
我用depends看了一下kernel32.dll发现里面函数的名称没有乱七八糟的@和_,猜测这些API函数也是采用了extern "C"来修饰的吧

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧