3

我参加了 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;
}

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

4

4 回答 4

4

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

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

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

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

于 2013-06-10T21:01:09.073 回答
1

Java 编译器可以通过它的名称和包找到一个类,并直接检查源代码。注意:如果 Java 编译器无法做到这一点,它将无法编译。

在 C 中,您可以将哪些定义放在哪里没有限制,因此您必须首先让它知道您以后可能要定义的内容。

于 2013-06-10T20:36:53.533 回答
1

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

于 2013-06-10T20:38:12.370 回答
0

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

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

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

  • 在同一个顶级班级的任何地方。函数定义不必放在所有调用之上。
  • 来自另一个类的源代码或编译的 *.class 文件。完全限定的类名允许在类路径中找到 *.class 文件。
于 2013-06-10T20:41:52.000 回答