【发布时间】:2017-11-26 22:38:56
【问题描述】:
我试图理解为什么我们需要在源代码中包含函数原型。据我了解: 为了从多个源文件中获取一个可执行文件,需要将源文件转换为目标文件。目标文件可以毫无问题地相互引用:例如,主文件可以调用 foo 函数,该函数将从另一个源文件编译。 链接器负责解析所有源文件中对各种函数/符号的所有引用。
我成功地独立编译了这两个文件,然后生成了可执行文件。您会注意到 main.c 中没有#include "function.h"
函数.c
int foo() {
return 1;
}
main.c
int main() {
return foo();
}
使用的命令:
gcc mainc.c function.c -S
gcc main.o function.o -o exec
由于函数 foo 的隐式声明,我收到第一个命令的警告,但输出 exec 正在工作。所以我的问题是:
为什么我们需要包含函数原型?
【问题讨论】:
-
因为标准要求它?
-
你选择了一个乐观的例子。但是尝试使用
float foo() { return 25.0; }看看当结果被解释为整数时会发生什么。 -
从 C99 开始,此代码将无法编译 - 不再允许隐式声明。
-
主要是为了避免在原型之前的日子里出现的错误,因为预期的功能实现与消费者提供的功能不匹配。由于有可用的原型,代码更加安全。从 C99 开始,您需要在调用函数之前在范围内声明函数。这不是对原型的正式要求——非原型声明就足够了——但拥有原型有很多好处。忽略它们你就是个傻瓜。