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

4

我已经学习了Java课程,并正在努力通过K&R自学C语言。到目前为止都很好,但我不明白原型的目的。请看下面代码中的两个 // 注释:

#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;
}

在Java中,您会声明一个函数类似于public static float convert(int f),完全不需要原型。这对我来说似乎更简单。为什么会有这样的区别?
4个回答

5

这基本上是为一个语言系统做出的决定。

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

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

更现代的语言如Java和C#省略了重复原型信息的需求。那么当它们需要原型时,它们如何编译代码呢?它们将原型信息与二进制代码一起存储,同时处理定义时自动生成原型信息。所以,实际上,原型信息只是由编译器自动生成的。


1
Java编译器可以通过类名和包名直接查找源代码中的类。注意:如果Java编译器无法执行此操作,则无法编译。
在C语言中,您可以将定义放置在任何位置,因此您必须首先让它知道您可能稍后要定义什么。

1
在C语言中,通常必须先声明标识符才能使用。函数原型作为函数的声明。C是一种老语言,强制程序员声明函数标识符有助于编译器/链接器的编程,特别是当函数在不同的翻译单元中使用和定义时。

1

无论是C还是Java都会在编译时检查函数调用是否与函数签名匹配。

C编译器始终依赖于源代码中的函数声明/原型。函数声明必须出现在调用之前。

Java编译器可以从以下位置获取函数声明:

  • 同一顶级类中的任何位置。函数定义不必放置在所有调用上方。
  • 从另一个类的源代码或已编译的*.class文件中获取。完全限定的类名允许在类路径中找到*.class文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接