C / C ++函数 - 如何允许原型?

时间:2017-03-17 00:08:12

标签: c++ c function compiler-construction prototype

标题

假设(因为,作为初学者,我不确定),编译器会从上到下读取源代码。如果尚未定义所述被调用函数,编译器如何理解在main函数中调用函数时应该执行的操作?

感谢。

2 个答案:

答案 0 :(得分:1)

在大多数体系结构中,调用函数所需的汇编指令仅取决于该函数的参数的数量和类型,而不取决于函数本身的实现方式。换句话说,调用任何以该顺序接受int和double的函数需要完全相同的汇编指令序列。

当编译器读取一个函数原型时,它通常不会生成任何代码,而只是在心理上注意到“好吧,当我看到有人从这一点开始调用此函数时,我会知道函数期望的参数的数量和类型,以便我可以生成正确的代码。“例如,如果它看到原型

 void doTheThing(int, double);

然后看到电话

double x, y;
doTheThing(x, y);

它可以生成评估x的代码,将其缩小为整数,然后(通过某种机制)将x和y的值作为参数存储到函数中,调用函数,然后清理参数。它知道将x转换为int的原因是它看到了原型,并且根据架构的工作原理,它可以设置机制来调用函数。

换句话说,原型本身不会生成任何代码。相反,它会通知编译器如何以一种导致参数被发送的方式生成代码,并以正确的形式和顺序提取返回值。

答案 1 :(得分:0)

作为类比:如果你把汽车带进维修店,你是否需要详细了解机械师用来诊断和修复问题的完整程序?不,您需要的只是与您如何与维修店互动的信息:您需要开车并最终将车开出去,您应该向他们付钱,他们可能会提供往返的礼宾班车你的工作地点等。

以类似的方式,C / C ++编译器能够生成机器代码,将程序执行的控制从一个函数移交给另一个函数,然后一旦被调用的函数完成,就恢复执行原来的函数关闭。它需要知道的是被调用函数的接口(通过原型指定),而不是它所做的全部细节。

(当然,如果编译器确实知道被调用函数的定义,那么它可以选择性地执行一些优化,直到"内联"完整函数定义到调用者。同样,如果你对汽车修理有所了解,你可以自己修理一些简单的问题,而不是把它带到机修工。)