优化包括在C中

时间:2017-02-17 08:14:03

标签: c

我的项目有几个头文件。大多数C源文件都包含 all ,所以几乎每个源文件都包含以下几行:

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

这应该移到某些all.h或类似的地方吗?有一个更好的方法吗?

3 个答案:

答案 0 :(得分:3)

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

另见this answer(提供两种方法的示例)。

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

支持多个头文件的一个可能原因是可读性和模块性。您可能希望每个模块和每个translation unit(几乎每个.c文件)都有一个(相当小的)头文件,您只需要包含最小的头文件集(按顺序排列)。 / p>

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

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

的文档

您几乎会使用build automation之类的GNU make系统。您可能希望自动生成依赖项(例如here)。

对于一个单人项目(最多几十个源代码行),我个人更喜欢有一个头文件,但这是一个意见和品味的问题(所以很多人不同意)。顺便说一下,当你的项目变得足够大时重构你的项目(几个头文件)很容易做到(但设计起来比较困难);您只需将一些代码块复制并粘贴到几个新的头文件中即可。

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

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

答案 1 :(得分:3)

在每个.c文件中,应该很容易知道它需要什么。通过按照自己的方式,您可能会忘记其所需的内容,而另一位同事则需要查找此文件。

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

答案 2 :(得分:3)

还有第三个,中间位置选项,最少common.h个内容,几乎所有翻译单元共享(例如stdint.h之类的标题)。或者,您可能决定将add.hsub.h和类似标题分组到一个ops.h标题中。

但实际上只有一个all.h标题会使封装/信息隐藏在C中比现在更难。宇宙飞船微控制器中的数学库是否真的需要了解生命支持系统的所有内容?

当然,C实际上并没有“一流的封装机制”,你可以在任何地方抛出extern函数声明,这就是为什么坚持合理的约定和最佳实践是非常重要的。