C: 为什么要包含声明但不定义的头文件?

C: Why do we include header files, which declare but don't define?

在高层次上,我理解我们使用 #include 语句使其他文件中的代码可用于当前文件。但是我不明白为什么我们包含一个头文件,其中包含声明但没有定义。

也许我需要更多地了解 compilation/linking 过程才能完全理解其机制,但是是否有我一开始没能掌握的高级概念?

编辑:所有答案都有助于澄清我的问题,归结为:一旦我们通知编译器在别处定义了一个函数,它如何确定在哪里找到那个定义?

因为如果在不同的 .c 文件中包含有定义的 header,您将有 多个定义

声明就足够了,因为它允许编译器生成调用代码,之后链接器负责查找定义并将函数调用链接到实际定义。

一个原因是您也可以使用预编译库。

一些开发库的人不想让每个人都知道完整的代码。他们把它变成了一个图书馆,然后创建了 headers 这样每个人都可以使用它。此外,@iharob 是对的,如果我们在 headers 中包含定义,它会给代码带来很多麻烦。

why we include a header file, which contains declarations but no definitions.

假设我们有一个文件

header.h

extern void func();

并且此函数在某个文件 f1.c 中定义,然后将由 f2.c 调用 包含所需的 header 以通知编译器该函数定义存在于某个其他文件中,而不包含 header 编译器将不知道对 func() 的调用在 main()

f1.c

void func()
{
}

f2.c

#include "header.h"
int main()
{
  func();
}

可以有多个声明,但同一个函数不能有多个定义

扩展名为.h的头文件只包括函数的声明。它的实际实现在单独的 .c 文件中提到。 .h 文件进一步包含 .h 文件的本地目录中存在的 .c 文件。如果你尝试在你创建自己的头文件的编译器上做一个项目,事情会更清楚