博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
调用约定__stdcall / __cdecl
阅读量:5899 次
发布时间:2019-06-19

本文共 664 字,大约阅读时间需要 2 分钟。

__cdecl与__stdcall这两种调用约定之间的主要差别在于由谁来执行对参数的清理工作。

如果是__cdecl,那么主调函数将负责执行清理工作,如果是__stdcall那被调函数将负责执行清理。
通常,我们倾向于使用__stdcall,它能够减少生成代码的规模。因为不需要每次调用时,都在返回后对esp进行操作,比如add esp, 0Ch.(抵消三个参数的大小)
__cdecl存在的意义是?支持变长数量的参数。

调用约定 参数传递 栈的清理工作 函数名修饰

stdcall  右到左  被调函数  函数名字前加"_",并且在后面增加以及栈空间所需要的字节数
cdecl  右到左  主调函数  在名字前加"_"
这种函数名的规范,在编译后,比如缺少lib文件时,会看到。

通常编译器和连接器将一起来确保根据调用约定调用正确的函数。但,有时连接器不能提供这种机制,此时必须小心避免不匹配的情况。

windows API一般都会有WINAPI的前缀,表示调用约定为

#define WINAPI 

Win32的API函数都遵循__stdcall调用约定。

在VC++开发环境中,默认的编译选项是__cdecl(C调用约定),对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall。在Windows程序中,回调函数必须遵循__stdcall调用约定,所以我们在声明回调函数时要使用CALLBACK。

 

转载于:https://www.cnblogs.com/qq76211822/p/4712016.html

你可能感兴趣的文章
IT职场人生系列之二:大学生活
查看>>
4.一对多关联映射
查看>>
十种贵人,四种朋友,遇到千万别放手!!
查看>>
Gitlab 6.3.1默认仓库路径修改
查看>>
F5大幅增强SDN集成和云扩展功能
查看>>
应用:Lync改变状态
查看>>
php分页
查看>>
10.25日模拟试题
查看>>
洛谷——P1330 封锁阳光大学
查看>>
php-fpm的max_chindren的一些误区
查看>>
libtool: install: error: cannot install `libaprutil-1.la' to a directory
查看>>
Sring a和String b的值相同,是不是指向同一个地址呢
查看>>
Linux命令-uptime
查看>>
1069 关押罪犯
查看>>
手机邮箱客户端开源项目
查看>>
Linux第七周
查看>>
笔记本电脑电池保养
查看>>
有理想的程序员必须知道的15件事
查看>>
MySQL学习笔记
查看>>
linux基础概念和个人笔记总结(1)
查看>>