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 文件。如果你尝试在你创建自己的头文件的编译器上做一个项目,事情会更清楚
在高层次上,我理解我们使用 #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 文件。如果你尝试在你创建自己的头文件的编译器上做一个项目,事情会更清楚