Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么';编译器不能从函数定义推断函数原型吗?_C_Compiler Construction - Fatal编程技术网

C 为什么';编译器不能从函数定义推断函数原型吗?

C 为什么';编译器不能从函数定义推断函数原型吗?,c,compiler-construction,C,Compiler Construction,我知道不包含函数原型是一种糟糕的做法,但如果不包含,编译器将根据调用函数时传递给函数的内容推断原型(根据)。我的问题是,为什么编译器会根据传递给函数的内容而不是函数本身的定义来推断原型?我可以想象某种预处理步骤,其中所有声明的函数都被识别和检查,以查看每个函数是否存在原型。如果没有原型,函数的第一行将被复制并粘贴在现有原型下。为什么不这样做呢?因为C编译器被设计为单过程编译器,任何给定的文件都不知道组成项目的其他源文件 尽管编译器已经变得越来越复杂,可能会进行多次编译,但编译过程框架的总体轮廓仍

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

因为C编译器被设计为单过程编译器,任何给定的文件都不知道组成项目的其他源文件

尽管编译器已经变得越来越复杂,可能会进行多次编译,但编译过程框架的总体轮廓仍与K&R时代一样:

  • 预处理每个源文件(仅宏文本替换)。
    • 将处理过的源代码编译成一个对象文件
  • 将对象链接到可执行文件或库中
推断原型必须在第一步中进行,但编译器不知道当时可能包含函数定义的任何其他对象的存在


也许可以制作一个按照您的建议进行编译的编译器,但必须打破现有的关于如何推断原型的规则。具有如此重大后果的更改将使该语言不再是C。

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

尽管编译器已经变得越来越复杂,可能会进行多次编译,但编译过程框架的总体轮廓仍与K&R时代一样:

  • 预处理每个源文件(仅宏文本替换)。
    • 将处理过的源代码编译成一个对象文件
  • 将对象链接到可执行文件或库中
推断原型必须在第一步中进行,但编译器不知道当时可能包含函数定义的任何其他对象的存在


也许可以制作一个按照您的建议进行编译的编译器,但必须打破现有的关于如何推断原型的规则。具有如此重大后果的更改将使语言不再是C语言。

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

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

主要原因是推断可能是错误的,确定类型的正确常量也很棘手。您知道原型的用途,对吗?如果函数定义在调用点可见,函数类型是根据定义推断出来的。从C99开始,编译器不会从调用中推断函数类型;调用没有可见声明的函数是违反约束的行为。(声明不必是原型。)主要是因为推断可能是错误的,并且确定类型的正确常量也很棘手。你知道原型的目的是什么,对吗?如果函数定义在调用点可见,则函数类型从定义中推断。从C99开始,编译器不会从调用中推断函数类型;调用没有可见声明的函数是违反约束的行为。(声明不必是原型。)