函数调用规则
2013-11-23 22:16
99 查看
很多C语言入门程序猿在学习C语言或者windows开发时会看到_cdecl,_stdcall函数调用规则。而一般的书籍都没有对其进行说明。除了这两个调用外,还有pascal方式的调用。下面是对这三个调用的一点解释。
一般的C语言编译器都是默认使用_cdecl规则的。去看vc中的一些头文件很发现,有很多都是_stdcall规则的。而pascal方式的规则很少用。
在解释之前,先说明一点东西。那就是在编译的过程中,编译器会将我们的源代码编译成汇编代码,再汇编成二进制的可以执行程序。看汇编代码,可以让我们比较清楚地了解到数据在内存的存放。我们写的程序和变量和参数都是放在栈中的,申请的动态空间是放在堆中的。而函数的调用过程中,不同的调用调用规则,参数放入栈的顺序就不同。
1)_cdecl规则
_cdecl规则将参数从右向左进入栈中。当函数返回后,由调用函数的调用者对堆栈进行清理。同时会生成比较大的可执行程序。
2)_stdcall规则
_stdcall规则也称为WINAPI,windows的API基本都是_stdcall调用。_stdcall规则也是将参数从右向左进入栈中,当函数返回时,由被调用函数对堆栈进行清理。生成的可执行程序比_cdecl规则生成的小。
3)pascal方式
pascal方式的规则主要用于win16的库中,现在基本不用了。pascal方式规则将参数从左向右进行栈中。当函数返回时,由被调用函数对堆栈进行清理。同时pascal不支持不确定个数参数的函数。
一般的C语言编译器都是默认使用_cdecl规则的。去看vc中的一些头文件很发现,有很多都是_stdcall规则的。而pascal方式的规则很少用。
在解释之前,先说明一点东西。那就是在编译的过程中,编译器会将我们的源代码编译成汇编代码,再汇编成二进制的可以执行程序。看汇编代码,可以让我们比较清楚地了解到数据在内存的存放。我们写的程序和变量和参数都是放在栈中的,申请的动态空间是放在堆中的。而函数的调用过程中,不同的调用调用规则,参数放入栈的顺序就不同。
1)_cdecl规则
_cdecl规则将参数从右向左进入栈中。当函数返回后,由调用函数的调用者对堆栈进行清理。同时会生成比较大的可执行程序。
2)_stdcall规则
_stdcall规则也称为WINAPI,windows的API基本都是_stdcall调用。_stdcall规则也是将参数从右向左进入栈中,当函数返回时,由被调用函数对堆栈进行清理。生成的可执行程序比_cdecl规则生成的小。
3)pascal方式
pascal方式的规则主要用于win16的库中,现在基本不用了。pascal方式规则将参数从左向右进行栈中。当函数返回时,由被调用函数对堆栈进行清理。同时pascal不支持不确定个数参数的函数。
相关文章推荐
- 函数调用规则
- x86 和 x64 汇编调用C 函数参数传递规则(GCC)
- 'VB编程 编写一个竞赛评分的函数过程。评委打分为参数(数组参数),选手得分为函数值。记分规则为:去掉一个最高分,去掉一个最低分,然后求平均。调用该函数,由键盘输入5个评委的打分(存放在数组中),输出
- 中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)--中断中的延迟delay与printk函数的冲突【转】
- 函数的调用规则——简单记忆
- JavaScript 函数调用规则
- 函数的调用规则(转)
- 中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)
- 函数调用规则的不同对回调函数使用的影响
- ATPCS和内嵌汇编:arm处理器上函数调用寄存器的使用规则
- 函数命名规则及调用约定(__cdecl,__stdcall,__fastcall)
- 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
- 函数名修饰和调用规则
- 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
- 函数模板和普通函数调用规则研究
- 函数调用约定 and 函数名字修饰规则
- 函数命名规则及调用约定(__cdecl,__stdcall,__fastcall)
- JavaScript 函数调用规则和if条件判断
- 函数名修饰和调用规则
- 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal, __thiscall)