2017-02-17 152 views
-1

我的项目有几个头文件。大多数的C源文件包括那些所有,所以几乎每一个源文件包含以下行:优化包含在C中

#include "add.h" 
#include "sub.h" 
#include "mul.h" 
#include "div.h" 
#include "conv.h" 
#include "comp.h" 
// etc. 

如果这被移动到一些all.h或类似的?有一个更好的方法吗?

+1

你的项目有多大(数千条源代码或数百万条代码)?你有多少贡献者(你是单独编写你的项目,还是你有几十个贡献者)? –

+1

你在为*优化什么?建立时间?行算不算? ...或一般开发人员的便利? – ideasman42

+1

还有第三个,在某些地方的中间选项,对于几乎所有的翻译单元(像'stdint.h'这样的标题都出现在我脑海中)共享的东西,都有一个common.h。 – Groo

回答

3

这两种方法都有亲和关系(有一个单一的all.h,包括所有的标题,不然),所以这也是一个意见问题。在一个相当小的项目中,只有一个包含所有常用声明的头文件(以及static inline函数的定义)也是可能的。

另请参阅this answer(它给出了两种方法的示例)。

有一个单一的标题(其中包括其他标题,甚至系统的标题)的一个可能的原因是启用该头文件的预编译。见this answer(和那里的链接)。

赞成几个头文件的一个可能的原因是可读性和模块化。您可能希望每个模块都有一个(相当小的)头文件,并且在每个translation unit(几乎每个.c文件)中都只包含最少的头文件集(以良好的顺序)。

请记住,C99 & C11(甚至C++ 14)do 不是有任何模块的概念;换句话说,C中的模块只是惯例的问题 & 习惯。习惯和习惯在C程序中非常重要,因此请看看其他人在现有的free software项目中(例如在githubsourceforge)正在做什么。

请注意preprocessing是大多数C编译器的第一个阶段。阅读有关您的C preprocessor的文档。

实际上你会使用build automation系统,如GNU make。您可能想要自动生成依赖关系(例如here)。对于一个单人项目(最多几十条源代码行),我个人更喜欢有一个头文件,但这是一个意见和口味(所以很多人不同意)。 。顺便说一句,当你的项目变得足够大时,重构你的项目(对几个头文件)很容易做(但更难设计);你只需复制&在几个新的头文件中粘贴一些代码块。

对于涉及多个开发人员的项目,您可能希望大多数文件(标题或代码)都有一个开发人员负责这个想法(其他开发人员对其进行偶尔更改)。

请注意,标题包含和预处理是文本操作。你甚至可能在理论上甚至避免使用头文件,并在你的.c文件中复制和粘贴相同的声明,但这是非常糟糕的做法,所以你不应该这样做(手写代码)。然而,有些项目是生成 C代码(某种metaprogramming),他们的C代码生成器(一些脚本或一些工具如bison)可能会在几个文件中发出相同的声明。

+1

在编译过程中,头文件是否刚刚链接,并在需要时将其带入内存?如果您没有真正使用某些标题的所有功能,那么当您将所有标题放在一个标题中时,是否会增加开销? –

+1

由于预处理是大多数编译器的第一阶段,因此头文件不会*链接*,它们在编译期间提前*包含*。 –

3

在每个.c文件中,应该很容易知道它包含了什么。按照自己的方式,您可能会失去跟踪需求的情况,另一位同事需要查找此文件。

换句话说,你不应该这样做,因为你在代码中失去了清晰度。

3

还有第三个中间选项,对于几乎所有翻译单元(例如stdint.h)的标头都有一个最小值common.h。或者,您可能决定将add.hsub.h和类似标题分组到一个ops.h标题中。

但字面上只有一个all.h头会使封装/信息隐藏在C中比现在更加困难。太空船微控制器中的数学库真的需要了解生命支持系统的一切吗?当然,C并没有真正的“一流的封装机制”,你可以在任何地方抛出一个函数声明,这就是为什么坚持合理的约定和最佳实践是相当重要的原因。