C:为什么我们要包括头文件,它们声明但不';不能定义?

C:为什么我们要包括头文件,它们声明但不';不能定义?,c,include,header-files,C,Include,Header Files,在较高的层次上,我理解我们使用#include语句使其他文件中的代码可用于当前文件。但我不明白为什么我们要包含一个头文件,它包含声明但没有定义 也许我需要学习更多关于编译/链接过程的知识,以充分理解机制,但是否有一个我一开始就没有掌握的高级概念 编辑:所有的答案都有助于澄清我的问题,这归结为:一旦我们通知编译器在别处定义了一个函数,它如何找到该定义?因为如果在不同的.c文件中包含有定义的标题,您将有多个定义 声明就足够了,因为它允许编译器生成调用代码,之后链接器负责查找定义并将函数调用链接到实际

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

也许我需要学习更多关于编译/链接过程的知识,以充分理解机制,但是否有一个我一开始就没有掌握的高级概念


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

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


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

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

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

为什么我们要包含一个头文件,它包含声明但没有 定义

假设我们有一个文件

标题.h

extern void func();
这个函数在一些文件f1.c中定义,然后由f2.c调用 包含所需的头,以通知编译器函数定义存在于其他文件中,而不包含头。编译器将不知道对
func()
的调用在
main()

f1.c

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

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

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

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

也许OP想知道为什么会产生多个定义以及为什么这是一件坏事。例如编译器按照每个文件从上到下处理这些文件,链接器使用这些信息收集所需的代码段。当一段代码在多个编译器输出中定义时,它会混淆使用哪个定义:)正确。不过,我感到困惑的是,声明接口如何足以访问定义。@ivan正如iharob在这个答案中所说的那样,声明在头文件中,并包含在.c文件中,编译器知道有一个函数的定义存在于某个我没有想到的地方。所以你可以使用一个包含的函数,本质上就像一个黑盒子。我想知道的是,编译器是如何知道在哪里找到定义的?@伊凡,如果我们考虑这种情况,你需要在其他的头文件中有一个函数,并且你的C文件里面有一个调用。include header将表示函数定义存在于其他文件中,否则您将出现compier错误您的“编辑”问题的答案是:编译器没有找到它;是的。使用选项和文件调用编译器,以便链接器(由编译器运行以将对象文件和库转换为可执行文件)具有所需的所有信息(函数等)。标准C库就是这样工作的。诸如
printf()
之类的函数在
中声明,编译器会自动链接C库,以便找到
printf()
的定义。对于代码,可以在命令行中列出对象文件,也可以将它们放入库中并链接到该库。