您的位置:首页 > 其它

函数调用规则

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不支持不确定个数参数的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: