我正在开发一个unix项目。经过大量搜索后,许多人建议使用头文件,因为它们用于编写需要在多个源文件之间共享的代码。
最好将定义集中在一个文件中 - 头文件。
现在我有两个疑惑:
1)使用头文件而不仅仅是.c文件有什么意义
从 this answer 开始,我得到的头文件没有编译成目标文件。 然后会发生什么(实际上gcc如何对待他们)?有什么好处? 我分享的答案是什么意思?
2)编写头文件的规则或约定是什么。我只知道这个:
头文件通常只包含数据类型的定义, 函数原型和C预处理器命令。
我们能否只写这个,即这是一个规则还是惯例?
任何人都可以告诉我任何来源,以了解如何编写头文件。
我只能找到这个 - Writing Larger Programs - 其中包含的内容并不多。或者用于编写更好和优化的头文件的任何其他提示或样式。
答案 0 :(得分:2)
1)头文件允许您在.c文件之间传递信息,例如定义,或者在其他.c文件中存在函数,这允许您将逻辑上属于的代码保存在一个地方; #include指令将命名文件视为命名文件的一部分,这样可以节省大量冗余类型
2)惯例是将#define,enum和函数声明传递到.h文件中,并在.c文件中使用实际的功能代码(除了偶尔的静态内联函数)
规则是:只要导致功能性程序,或多或少允许编译器进食而不会死亡。这些约定或多或少地存在,以帮助您将项目保持在可理解,可维护的状态。
答案 1 :(得分:0)
我认为最好的是理解为什么头文件很有用(2)以及它们如何工作(1)。然后,您可以自己决定要遵循的惯例。
1)“include”指令的作用是指令中指向的文件完全包含在当前编译的文件中。这应该是直截了当的。
2)通常,管理拆分为多个C文件的C项目更容易。这可能是因为大小原因(考虑具有数千行代码的项目 - 如何在这样的文件中滚动)以及管理原因(考虑多个人在项目上工作 - 更容易分担责任)。
在多C文件项目中,您需要调用其他文件中的函数。我们举个例子:
fileA.c
int function_a() {
uses somewhere function_b
}
fileB.c
int function_b() {
uses somewhere function_c
}
fileC.c
int function_c() {
uses somewhere function_a
}
要调用任何函数,首先需要声明它(或定义它)。要明确:声明是指定返回类型和参数时,定义是指定代码的时间。在上面的示例中,您无法将一个C文件“包含”到另一个C文件中,以便在使用之前定义所有函数。因此,您必须在调用函数之前添加函数的“声明”。你在哪里可以添加这样的声明?如果你在fileA.c中添加了function_c的声明,这很难维护(想想你可以将这个场景放在几十个文件上,跟踪所有的声明都很困难。)
同样适用于类型。
此问题的解决方案是为每个C文件创建一个“标头”文件,您可以在其中声明程序的其他模块所需的所有函数(和类型)。这些文件可以按任何顺序包含在所有其他需要这些功能的C文件中,并且是一个集中的地方,如果你更改了一个功能,你知道需要修改它。