假设我在 C 语言中处理一个包含多个.c
文件的大型项目,有什么理由让我更喜欢拥有多个头文件而不是单个头文件?
还有一个问题:
假设我有 3 个文件header.h
:main.c
和other.c
.
我有一个名为的函数,该函数func()
仅在文件中定义和使用other.c
。我应该将函数原型放在头文件还是文件中other.c
?
假设我在 C 语言中处理一个包含多个.c
文件的大型项目,有什么理由让我更喜欢拥有多个头文件而不是单个头文件?
还有一个问题:
假设我有 3 个文件header.h
:main.c
和other.c
.
我有一个名为的函数,该函数func()
仅在文件中定义和使用other.c
。我应该将函数原型放在头文件还是文件中other.c
?
多个标头与单个标头。
使用多个标头的主要原因是某些代码可能独立于其他代码使用,并且该代码可能应该有自己的标头。在极端情况下,每个提供服务的源文件(或一小组源文件)都应该有自己的标头,用于定义服务的接口。
另请注意,标题中包含使用模块所需的信息 - 函数声明所需的函数声明和类型声明(您没有全局变量,对吗?)。标头不应包含仅由模块实现所需的标头。它不应该只定义模块实现所需的类型。它不应该定义不属于模块正式接口的函数(模块内部使用的函数)。
一个模块中的所有功能都static
应该是static
.
您当前的项目可能仍然有一个综合头文件,其中包括所有或大部分或单独的头文件,但如果您将头文件视为定义模块的接口,您会发现大多数消费者模块不需要知道所有可能的提供者模块。
该功能func()
仅在中使用,other.c
因此应使该功能static
仅在中可见other.c
。除非其他文件使用该函数,否则它不应该放在头文件中——在这一点上,它确实进入头文件是至关重要的。
您可能会在这些其他问题中找到有用的信息,毫无疑问,还有很多其他问题也会有所帮助:
如果它是一个大项目,您几乎肯定必须拥有多个头文件才能使您的项目变得合理。
我从事的项目有数千个源文件和数百个头文件,总计数百万行。您不能将所有这些头文件放在一个文件中,并做任何有意义的工作。
头文件应该提供一个“功能”。因此,如果您有一个处理客户帐户、库存、发票等的程序,您可能有一个“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
对其余代码的任何更改都正常。
通常,每个模块都有一个头文件来描述其接口,以便清晰地分离关注点/可读性/可重用性。
如果 other.c 中的函数是本地的,则无需将其包含在头文件中。