函数调用规则

来源:互联网 发布:java 图片合成 二维码 编辑:程序博客网 时间:2024/05/11 18:45
   很多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不支持不确定个数参数的函数。
原创粉丝点击