为什么C需要原型函数而Java不需要?

eri*_*sse 4 c java prototype function

我已经学习了 Java 课程,并正在尝试使用 K&R 自学 C。到目前为止一切顺利,但我不明白原型的目的。请参阅下面代码中的 2 // 注释:

#include <stdio.h>

float convert(int); **//Why is this needed...**

main()
{
    int i;

    for(i = 0; i <= 300; i += 20)
        printf("F: %3d C: %6.1f\n",i,convert(i));

    system("Pause");
    return 0;
}

float convert(int f) **//When we already have this?**
{
    float c = (5.0/9.0) * (f-32.0);
    return c;
}
Run Code Online (Sandbox Code Playgroud)

在 Java 中,您可以声明类似的函数public static float convert(int f),但根本不需要原型。这对我来说似乎简单得多。为什么有区别?

Zif*_*ion 5

这本质上是针对语言系统做出的决定。

请注意,Java 和 C 编译器都需要知道函数签名,以便它们可以进行类型检查并编译代码。

另请注意,像 C 这样的语言需要您单独提供此签名/原型(在声明中),而实际上函数定义具有完全相同的信息。因此,这基本上是信息的重复。为什么是这样?本质上,这是为了在没有包含定义的实际源代码的情况下可以编译代码。因此,如果一个库以二进制代码的形式提供,那么拥有包含原型的标头就足以允许编译使用该库中的代码的其他代码。

Java 和 C# 等更现代的语言不再需要重复此原型信息。当他们确实需要原型时,他们如何编译代码?他们所做的就是在处理定义时将原型信息与二进制代码一起存储。所以,实际上,原型信息只是由编译器本身自动生成的。