假设我使用多个.c
文件处理C中的大型项目,是否有任何理由我更喜欢使用多个头文件而不是单个头文件?
另一个问题:
假设我有3个文件:header.h
,main.c
和other.c
。
我有一个名为func()
的函数,它只在文件other.c
中定义和使用。我应该将函数原型放在头文件中还是文件other.c
?
答案 0 :(得分:7)
多个标头与单个标头。
使用多个标头的主要原因是某些代码可以独立于其余代码使用,并且该代码可能应该有自己的标头。在极端情况下,提供服务的每个源文件(或一小组源文件)都应该有自己的标头来定义服务的接口。
另请注意,标题中的内容是使用模块所需的信息 - 函数声明所需的函数声明和类型声明(您没有全局变量,是吗?)。标头不应包含模块实现仅需要的标头。它不应该只定义模块实现所需的类型。它不应该定义不属于模块正式接口的函数(模块内部使用的函数)。
模块中可以static
的所有功能都应该是static
。
您当前的项目可能仍然有一个包含所有或大多数单独标题的综合标题,但如果您认为标题定义为模块的接口,您会发现大多数消费者模块不需要了解所有可能的提供者模块。
功能func()
仅在other.c
中使用,因此该功能应static
,以便仅在other.c
中可见。它不应该进入标题,除非其他文件使用该函数 - 此时,它必须进入标题。
您可以在这些其他问题中找到有用的信息,毫无疑问,还有许多其他问题也会有所帮助:
答案 1 :(得分: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中也非常有用”,然后将其添加到合适的头文件(或创建新的头文件),并删除{{ 1}}。现在,任何阅读源文件的人都知道他们需要在此源文件之外进行检查,以确保在其余代码中对static
的任何更改都是正常的。
答案 2 :(得分:1)
通常,每个模块都有一个头文件,用于描述其关注点/可读性/可重用性的清晰分离。
如果other.c中的函数是本地函数,则无需将其包含在头文件中。