首页 > 解决方案 > C 中的标头是必需的吗?

问题描述

我是一个初学者,所以请提前原谅我。我开始学习 C 并且标题的概念在我的课程中是必要的。但是当我想测试我创建了 1 个附加文件时,现在我有 2 个文件:main.c 和 test.c。我在 test.c 中创建了一个函数并在 main.c 文件中运行它。起初我认为它不起作用,因为我没有预处理器的标题或 test.c,但它确实起作用了。我在多个谷歌搜索中发现,使用标头与静态(本地)函数有关系,我理解这一点,但其他回复说它有一个与交叉递归问题的链接并使编译更容易但是当我搜索更多信息时我没有发现什么清楚的。首先,这些是我们需要标头的真正原因吗?二、人们所说的“是什么意思”

标签: crecursionheader

解决方案


是否需要头文件取决于您想要实现的目标。当您编译 .c 文件时,您将编译该文件中包含的所有代码。如果你想使用另一个文件或库中的元素(函数、常量等),编译器必须知道这样的元素存在以及在哪里。

所以,这里有两个选择:要么在你正在编译的文件的代码中定义元素,要么在其他地方定义元素。在这种情况下,您想使用另一个文件中的元素。所以编译器必须有办法知道这样的函数存在并被实现。这就是#include指令的来源。这是一个预处理器指令,即编译前的步骤,代码准备编译。这主要是删除注释和管理预处理器指令,例如#include 和#define。

« #include "file" » 只需获取指定的文件并将代码行倒入您正在编译的代码中。也就是说,它是纯粹的、简单的文本替换。在这种情况下,您在 test.c 中定义了一个函数,并且您可能在 main.c 文件中添加了#include "test.c"。所以预处理器获取文件“test.c”,并用文件“test.c”中的文本替换预处理器指令(#include“test.c”)。

这样,您最终将在 main.c 文件中定义函数,因为编译器看到的也包含函数定义。您可以通过在某个文件夹中编译,然后将可执行文件移动到另一个位置并执行程序来测试它。它执行得很好,因为您执行了类似于函数的静态链接的操作:代码在编译时被注入到 main.c 文件中。

现在,头文件:头文件只是声明方法头(有时称为原型)的文件,但实际上它们不一定要实现。实现(实际编译的机器代码)在另一个文件中:一个(可能共享的)库。所以基本上,包括头文件让编译器知道声明了一组元素(函数、常量等),但它们是在其他地方实现/定义的。这允许程序成功编译(如果所需的库是使用 -libxyz 选项导入的或默认导入的,例如 stdio),因为它知道您在 main.c 文件中使用的元素是在某处定义的。这允许库动态或静态链接到程序。

所以基本上文件的扩展名或类型显然不相关,您可以#include许多文件并且行为相似,但我认为在为您的程序创建库的情况下需要。


推荐阅读