1

假设我在 C 语言中处理一个包含多个.c文件的大型项目,有什么理由让我更喜欢拥有多个头文件而不是单个头文件?

还有一个问题:

假设我有 3 个文件header.hmain.cother.c.
我有一个名为的函数,该函数func()仅在文件中定义和使用other.c。我应该将函数原型放在头文件还是文件中other.c

4

3 回答 3

7
  1. 多个标头与单个标头。

    使用多个标头的主要原因是某些代码可能独立于其他代码使用,并且该代码可能应该有自己的标头。在极端情况下,每个提供服务的源文件(或一小组源文件)都应该有自己的标头,用于定义服务的接口。

    另请注意,标题中包含使用模块所需的信息 - 函数声明所需的函数声明和类型声明(您没有全局变量,对吗?)。标头不应包含仅由模块实现所需的标头。它不应该只定义模块实现所需的类型。它不应该定义不属于模块正式接口的函数(模块内部使用的函数)。

    一个模块中的所有功能都static应该是static.

    您当前的项目可能仍然有一个综合头文件,其中包括所有或大部分或单独的头文件,但如果您将头文件视为定义模块的接口,您会发现大多数消费者模块不需要知道所有可能的提供者模块。

  2. 该功能func()仅在中使用,other.c因此应使该功能static仅在中可见other.c。除非其他文件使用该函数,否则它不应该放在头文件中——在这一点上,它确实进入头文件是至关重要的。

您可能会在这些其他问题中找到有用的信息,毫无疑问,还有很多其他问题也会有所帮助:

于 2013-08-26T23:45:39.750 回答
2

如果它是一个大项目,您几乎肯定必须拥有多个头文件才能使您的项目变得合理。

我从事的项目有数千个源文件和数百个头文件,总计数百万行。您不能将所有这些头文件放在一个文件中,并做任何有意义的工作。

头文件应该提供一个“功能”。因此,如果您有一个处理客户帐户、库存、发票等的程序,您可能有一个“customer.h”、一个“stock.h”和一个“invoice.h”。您可能还会有一个“dateutils.h”,用于计算“这张发票需要在什么时候支付,以及发票发出后有多长时间,以发出提醒。

一般来说,保持头文件 SMALL 是一件好事。如果一个头文件需要另一个头文件的东西,让它包含它。

当然,如果一个函数没有在特定文件之外使用,它不应该放在头文件中,为了避免“泄漏名称”,它应该是static. 例如:

 static void func(int x)
 {
    return x * 2;
 }

如果由于某种原因需要前向声明func(因为某些函数之前func需要调用func),则在源文件的开头声明它。无需通过将其添加到头文件来“传播”它。

通过标记它static,您可以清楚地表明“在此文件之外没有其他人使用此功能”。如果在稍后阶段,您发现“嗯,这func在模块 B 中也很有用”,则将其添加到合适的头文件中(或制作一个新的头文件),并删除static. 现在,任何阅读源文件的人都知道,他们需要在源文件之外进行检查,以确保func对其余代码的任何更改都正常。

于 2013-08-26T23:54:40.323 回答
1

通常,每个模块都有一个头文件来描述其接口,以便清晰地分离关注点/可读性/可重用性。

如果 other.c 中的函数是本地的,则无需将其包含在头文件中。

于 2013-08-26T23:45:05.393 回答