为什么编译器不从函数定义中推断函数原型?

时间:2014-08-15 15:22:16

标签: c compiler-construction

我知道不包含函数原型是不好的做法,但如果不这样做,那么编译器会根据你调用它时传入函数的内容推断原型(根据this answer) 。我的问题是为什么编译器会根据您传递给函数的内容推断原型而不是函数本身的定义?我可以想象某种预处理步骤,其中识别并检查所有声明的函数以查看每个函数是否存在原型。如果没有原型,则复制该函数的第一行并将其粘贴在现有原型下。为什么不这样做?

2 个答案:

答案 0 :(得分:7)

因为C编译器被设计为单通道编译器,所以任何给定的文件都不知道构成项目的其他源文件。

尽管编译器已经变得更加复杂,并且可能会进行多次传递,但编译过程框架的总体概要仍然保留在K& R的那一天:

  • 预处理每个源文件(仅限宏文本替换)。
    • 将已处理的源代码编译为目标文件。
  • 将对象链接到可执行文件或库中。

推断原型必须在第一步中发生,但编译器不知道当时可能包含函数定义的任何其他对象的存在。

有可能制作一个符合你的建议的编译器,但不能打破现有的如何推断原型的规则。如此重大的变化会使语言不再是C语言。

答案 1 :(得分:1)

原型的主要用途是声明一个函数,并在定义不可见的情况下通知编译器的参数的数量和类型。由于C最初是单通道编译的,因此定义在翻译单元中稍后出现时是不可见的,但从现代角度来看更重要的情况是当定义根本不可见时,由于位于单独的翻译单元中,甚至可能在只以编译形式存在的库文件中,并且不记录有关函数类型的信息。