什么时候.c文件没有关联的.h文件?

时间:2010-10-28 14:05:01

标签: c header-files

在C编程中,大多数时候似乎每个代码文件(.h)都会有一个头文件(.c),至少对于函数原型而言。

什么时候没有代码文件的头文件?

8 个答案:

答案 0 :(得分:8)

有一些用例。最明显的是你的主程序很少需要头文件。

第二个是每个C文件都有一个标题的地方。我之前把库放在一起(假设这个答案的目的是一个BTree库),其中每个单独的函数都在它自己的源文件中,但是有一个库范围的头文件,如:

btree.h
btree_priv.h
btreeInit.c
btreeDestroy.c
btreeConfig.c

等等。私有头文件用于需要在代码之间共享但不在API中发布的内容。

答案 1 :(得分:5)

最明显的是.c完全自包含且不需要原型或extern用于其他.c文件。这基本上只适用于非常小的程序,或者通过def文件导出以插入预定义接口的程序。

答案 2 :(得分:5)

我见过大量的代码库,其中单个.h文件定义了某个组件的接口,并且有几个.c文件实现了它。纯粹出于可维护性的原因,实现被分成几个文件,并且在某些逻辑边界上进行了尝试。

有人可能会争辩说,这样的逻辑界限可以应用于将组件划分为子组件,因此有几个头文件,但设计决策很少是黑色和白色事件,有时这种方法确实有意义。

答案 3 :(得分:3)

当.c文件包含任何代码都不需要使用的数据时。

不可否认,这种情况很少见 - 但可能会发生。例如,我在嵌入式设备中完成了这项工作,用引导图形填充视频帧缓冲区。

答案 4 :(得分:3)

如果将程序划分为多个模块,通常会有一个“main”模块,其中包含main()函数和其他一些东西。如果此模块没有任何应该被其他模块调用或使用的模块,则无需在.h文件中导出接口。

答案 5 :(得分:3)

我认为期望.c和.h文件之间的一对一映射是一个糟糕的开始假设。扔出去,开始新鲜。 :d

以不同的方式查看您的问题,您可能会问“何时创建头文件?”

我建议如下,其中术语“代码模块”是一个或多个相关.c文件的组(通常是目录):

  1. 为公共接口/定义创建一个必须可供其他代码模块使用的标头。
  2. 为私有接口/定义创建一个标头,该标头必须在代码模块中共享,但不能与其他代码模块共享。
  3. 这些是您应该需要的唯一头文件。如果这些都不是必需的那么你就不需要标题。

    有些程序员喜欢人工地将原型/宏/ typedef / etc分离成.h中的.h中的全局/函数.h。我建议不要使用这种方法,并建议在一个文件中包含所有相关功能。然后根据需要移动到标题,以防止在其他.c文件中出现'extern'。

答案 6 :(得分:1)

如果你不需要.h文件中的声明,但实际上从来没有。

答案 7 :(得分:1)

通常情况下,我会为'main'创建一个头文件,即使我不希望其他代码必须访问它,因为经常(1)调试版本最终需要主模块以外的东西访问其中的内容,或(2)由于(嵌入式系统)编译器限制,主模块最终将被拆分。每个.c文件包含它自己的.h文件的模式足够强大,我甚至会为.c文件创建几乎空的.h文件,这些文件定义了代码中未引用的内容(如中断跳转表)等等。)。

当文件包含多个程序生成的文件时,命名约定会变得有点棘手,或者包含需要多次编译的文件(例如,我的一个项目有两个电机,其代码相同,只是它们使用不同的I / O端口和不同的变量;我的motor.c文件包含:

#define LOCK L0
#include "motor.i"
#undef LOCK
#define LOCK L1
#include "motor.i"
#under LOCK

请注意,在这个特定的嵌入式编译器上, - >运算符效率很低,所以声明如下:

  L0.speed++;

将编译为一条指令,而语句如:

  L0->speed++;
如果'speed'是结构中的第一个项目,

将转换为五个指令,如果它占据任何其他位置,则转换为七个指令。因此,使用常量可解析地址复制代码比使用一个例程处理两个电机更加节省速度,并且更节省空间。

如果有一个与.c文件关联的额外文件,并且它包含真实代码,我将其命名为“.i”。但是,如果不止一个,不知道该怎么办。