在较高的层面上,我理解我们使用#include
语句从其他文件中获取当前文件的代码。但我不明白为什么我们要包含一个头文件,其中包含声明但没有定义。
也许我需要更多地了解编译/链接过程以充分理解机制,但是我是否有一个我从一开始就未能掌握的高级概念?
编辑:所有答案都有助于澄清我的问题,归结为:一旦我们通知编译器其他地方定义了一个函数,它如何找出在哪里找到该函数定义
答案 0 :(得分:3)
因为如果您在不同的.c
文件中包含有定义的标题,您将拥有多个定义。
声明就足够了,因为它允许编译器生成调用代码,之后链接器负责查找定义并将函数调用链接到实际定义。
答案 1 :(得分:2)
一个原因是你也可以使用预编译的库。
答案 2 :(得分:1)
为什么我们包含一个头文件,其中包含声明但没有 定义
我们说我们有一个文件
<强> header.h 强>
extern void func();
此函数在某个文件f1.c中定义,然后由f2.c调用
包括必需的头以通知编译器函数定义存在于某个其他文件中而不包括头文件,编译器将不知道对func()
的调用是在main()
<强>在f1.c 强>
void func()
{
}
<强> f2.c 强>
#include "header.h"
int main()
{
func();
}
可以有多个声明,但不能为同一个函数设置多个定义
答案 3 :(得分:0)
有些开发图书馆的人不想让每个人都知道完整的代码。他们使它成为一个库,然后创建标题,以便每个人都可以使用它。而且,@ iharob是对的,如果我们在标题中包含定义,它会给代码带来很多麻烦。
答案 4 :(得分:0)
扩展名为.h的头文件仅包含函数的声明。它的实际实现在一个单独的.c文件中提到。 .h文件还包含.h文件,该文件存在于.h文件的本地目录中。如果您尝试在创建自己的头文件的编译器上执行项目,事情会更加清晰