2012-04-12 46 views
2

可能重复:
What are the point of header files in C?写作规则或惯例和工作 - 头文件使用C

我在UNIX项目。搜索了很多之后,许多人认为使用的头文件,因为它们是用来编写需要进行多个源文件之间共享代码。

最好将定义集中在一个文件 - 头文件中。

现在我有两个怀疑
1)什么是使用头文件在简单的.c文件的意义。
作为从this answer我得到的头文件就不会被编译到目标文件。 然后发生什么事(实际上是如何对待GCC他们)?有什么好处? 我共享的答案想要指出什么?

2)什么是写入头文件的规则或约定。我只知道这一点:

头文件通常只包含数据类型的定义, 函数原型和C预处理器命令。

我们可以只写这个,即这是一个规则或惯例吗?

谁能告诉我任何源代码来学习如何编写头文件。

我能找到的只有这个 - Writing Larger Programs - 它不包含太多。或者用于编写更好和优化的头文件的任何其他提示或样式。

回答

2

1)的头文件允许传递.c文件,例如,定义,或在其他.c文件功能的存在,它可以让你保持在逻辑上属于聚集在一处的代码之间的信息; #include指令将指定的文件当作其名称所在的文件的一部分进行处理,这允许您节省大量多余的键入操作。

2)约定是通过#define,enum和函数声明转换成.h文件,并在.c文件中加上实际的功能代码(除了偶尔的静态内联函数)

规则是:不管编译器会死多少都会被允许,只要它导致功能程序。这些约定或多或少地存在以帮助您将项目保持在可理解的可维护状态。

+0

回答问题。我们可以通过编写.c文件并包含它来获得所有这些功能。那为什么呢? 第二个问题的答案。根据你的说法,我有.h文件中的函数声明和.c文件中的定义,如果我包含.h文件(它有声明),那么.c文件(带有定义)将被包含在内,或者I必须编写不同的include语句以包含.c文件 简单地说,我想学习如何编写相同的文件。有没有什么资料来源,书中用例子来解释它? – 2012-04-12 12:05:48

+0

,因为如前所述,#include包含了名为文件的文本,如果你命名了一个.c文件,它就包含了该文件。 .h文件约定用于应该在各种.c文件之间共享的信息。如果你问“为什么要有.h文件”,答案基本上是能够在.c文件之间共享代码,而不必直接包含它们。 – tbert 2012-04-12 12:12:16

+0

正如我分享了上述问题的特定答案,这个答案更多地解释了为什么要与.h共享代码。我只需要对此进行一点解释。 – 2012-04-12 12:20:00

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文件“包含”到另一个文件中,这样所有的函数在使用之前就已经被定义了。所以,你必须在函数被调用之前添加一个“声明”。你可以在哪里添加这样的声明?如果你在fileA.c中添加了一个function_c的声明,这很难维护(想想你可以将这个场景放在几十个文件中,这将很难跟踪所有的声明)。

同样的事情适用于类型。

此问题的解决方案是为每个C文件创建一个“头文件”文件,其中声明了程序其他模块所需的所有函数(和类型)。这些文件可以以任何顺序包含在所有需要这些功能的其他C文件中,并且是一个集中的地方,如果您更改了某个功能,则需要修改它们。

+1

因为解决方案是为每个C(比如A.c)文件创建一个“头文件”(比如A.h)文件。如果我们想在不同的c(比如Bc)文件中使用这个头文件的函数,我们必须包含这个头文件(Ah),而不是他的c文件(Ac) – 2012-04-12 12:22:49

+0

@knoxxs是的,这也是预期的用途,也是惯例。 – HonkyTonk 2012-04-12 12:44:36