4

在网上查了半个小时,找不到任何关于函数原型的优点的合理讨论。

我在 Java/Android 中管理,并且正在开始 C 课程。与我之前的经验相比,原型制作看起来很麻烦,我想知道它在 2013 年仍然存在的原因。

我知道里奇和他的朋友们的生活更加艰难。但是,今天可以编写一个编译器,它会在第一遍中生成一个函数列表,然后使用该函数列表执行其通常的操作,因为当前编译器将使用头文件。

仅仅因为向后兼容性,它可能也不能持续存在。根据显示的代码,创建一个可以在当前操作模式和我刚刚描述的假设的新模式之间切换的编译器是可行的。

如果原型设计持续存在,那么它必须引起程序员的兴趣,而不是编译器程序员的兴趣。我是对还是错 - 我在哪里可以找到关于功能原型设计与无原型设计优势的合理讨论?

4

2 回答 2

8

你忘记了在 C 中你可以调用一个你没有源代码的函数。

C 支持代码的二进制分发,这在(商业)库中很常见。

您将获得一个声明 API(所有函数和数据类型)和 .lib(或您的平台使用的任何平台)文件中的代码的标头。这通常是所有 C 标准库的情况。当然,您并不总是能够获得编译器供应商库的源代码,但您仍然必须能够调用这些函数。

为此,C 编译器在处理您的代码时必须具有声明,这样它才能为调用生成正确的参数,当然也可以正确处理任何返回值。

仅仅依靠你的来源是不够的,因为如果你这样做了

GRAPHICSAPI_SetColorRGB(1, 1, 1);

但实际的声明是:

void GRAPHICSAPI_SetColorRGB(double red, double green, double blue);

如果没有原型,编译器无法神奇地将您的int参数转换为。double当然,拥有原型可以对调用是否有意义进行错误检查,这是非常有价值的。

于 2013-01-22T14:47:27.040 回答
3

关于让编译器首先查看所有源文件以注意所有函数原型的有趣想法。

然而

  • 库(目标代码)需要在某处有它们的声明,这就是包含存在的原因

此外,我发现能够将grep包含为“自由文本”很方便,例如

grep alloc /usr/includes/*
于 2013-01-22T14:47:45.417 回答