关于函数的参数调用方式

本来看win32程序时,发现函数前面多了个CALLBACK之类的东西,感到疑惑,然后查了些资料,结果发现些更不懂的东西。。书上讲到了PASCAL调用规范,说是按这个规范调... 本来看win32程序时,发现函数前面多了个CALLBACK之类的东西,感到疑惑,然后查了些资料,结果发现些更不懂的东西。。
书上讲到了PASCAL调用规范,说是按这个规范调用时,函数参数“自左至右”压入堆栈,然后“自右至左”计算参数值,而C语言的调用规范正好与之相反。还说PASCAL调用由被调函数还原堆栈指针,而C的调用规范则由主程序来完成。
首先,这里有疑问:
这里所谓的“参数入栈”,入栈的是实参吧?计算参数是什么意思?就是把实参赋值给形参吗?为什么要入栈而不直接计算参数?
那么这个计算参数的过程只是在函数调用开始时进行一次就好了吧?书上说根据PASCAL的入栈出栈过程,在参数计算结束后就刚好使堆栈指针回复原状,而C规范不行,所以C规范要由主程序还原堆栈指针。但是根据C规范:从右至左入栈,从左至右计算,我觉得堆栈指针也是回到原处的啊!还是说我这书上描述有误呢?
还有一点,写C程序的时候也没听说一调用函数就要写一些什么还原堆栈的代码呀,是不是这些代码由编译器编译的时候完成了呢?
我知道我的问题是有点多,甚至有些可能不知所谓,希望对这些比较清楚地前辈能够耐心的一一解答一下。如果有些确实不好回答,跳过也行。。先谢谢了。
展开
 我来答
捡到的幸福
2010-11-08 · TA获得超过1282个赞
知道小有建树答主
回答量:568
采纳率:0%
帮助的人:350万
展开全部
PASCAL 也好 ,c也好,编译之后都是cpu能认得机器码
cpu每次只能执行一条指令。他是不知道自己执行到那个位置的。
当调用一个函数时,cpu执行的指令也就跳转到函数开头的那条指令了,但如果函数有参数的话,那cpu就不知道在哪里取出之前的参数了(无论是形参还是实参,cpu都是认为是一个数值)。
计算机前辈们就想出了一个这样的方法:
在调用函数之前,先把参数逐个压到栈里,因为栈的地址cpu是知道,那cpu就可以取出参数,栈是先进后出的。
然后cpu就跳到函数开头的指令进行执行,取参数时cpu就从栈里pop一个出来就行了
这里就出现你说的问题了,c的规范是从右到左压入栈的,那么进到函数里后参数出栈的顺序相反,就得以区分那个参数对应于那个变量
PASCAL相反。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式