8.5.8 实现函数调用

当一个函数被调用时,计算机实际上做了什么呢?第6章和第7章中的函数expression()、term()和primary()可以很好地说明这一问题,除了一个细节:这些函数都不接受参数,因此我们无法用它们解释参数是如何传递的。但是,请等一等!这些函数必然是获取一些输入的,否则它们不可能做任何有用的事情。实际上它们接受了一个隐含的参数:它们使用了一个称为ts的Token_stream对象来获得输入,而ts是一个全局变量。这有点偷偷摸摸的。我们可以改进这些函数,让它们接受一个Token_stream&类型的参数。因此本节中这几个函数都被增加了一个Token_stream&参数,而所有与函数调用实现不相关的内容都被去掉了。

首先,函数expression()非常简单,它有一个参数(ts)和两个局部变量(left和t):

第二,函数term()与expression()非常类似,只是多了一个额外的局部变量(d),用来保存除法运算的除数。

第三,函数primary()与term()很类似,只是多了一个局部变量left:

现在这些函数已经不再使用任何“偷偷摸摸的全局变量”了,用来说明函数调用机制已经非常理想了:它们都有一个参数,都有局部变量,而且它们相互调用。你可能希望有机会重新回顾一下完整的expression()、term()和primary()是什么样,但与函数调用相关的特性这里都已经给出了。 ...

Get C++程序设计:原理与实践(基础篇)(原书第2版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.