__stdcall与__cdecl
来源:互联网 发布:node sass失败 编辑:程序博客网 时间:2024/05/21 04:25
以下文字由网络查找而得:
1.__cdecl 是C DECLaration的缩写(declaration,声明)
入栈方式: 所有参数从右到左依次入栈
出栈方式: 这些参数由调用者清除,称为手动清栈
对函数名称的影响: VC将函数编译后会在函数名前面加上下划线前缀
被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。
2.__stdcall 是StandardCall的缩写
入栈方式: 所有参数从右到左依次入栈
如果是调用类成员的话,最后一个入栈的是this指针
出栈方式: 这些堆栈中的参数由被调用的函数在返回后清除
使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间
称为自动清栈
对函数名称的影响:VC将函数编译后会在函数名前面加上下划线前缀
在函数名后加上"@"和参数的字节数
int f(void *p) -->> _f@4(在外部汇编语言里可以用这个名字引用这个函数)
函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。
总结:
__stdcall与__cdecl是两种不同的函数调用约定,定义了函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈,以及产生函数修饰名的方法。对于参数个数可变的函数,例如printf,使用的是__cdecl调用约定,Win32的API函数都遵循__stdcall调用约定。在VC++开发环境中,默认的编译选项是__cdecl,对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall。(vc中CALLBACK 、WINAPI、 APIENTRY都是__stdcall)
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl __fastcall与 __stdcall
- __cdecl,__fastcall与__stdcall
- __cdecl 与__stdcall
- __cdecl __fastcall与 __stdcall
- POJ 1833 排列
- opendaylight——web中osgi的bundle的安装与卸载
- mips指令
- 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
- gnuplot
- __stdcall与__cdecl
- 可变参数函数
- PS 快捷键大全
- 教你打包Java程序,jar转exe随处可跑
- POJ 2117 Electricity 计算联通块的个数
- currying in javascript-js柯里化
- gnuplot 加中文
- AVL树的插入和删除
- 棋盘覆盖