我应该,还是不应该在不同的c文件中包含相同的标题,而这些文件又是主文件中使用的标题?

时间:2015-01-04 18:38:08

标签: c precompiled-headers

我正在构建一个main.c文件,以利用几个不同的.h文件中的函数。这些.h文件中的一些(或者更确切地说,它们的.c源文件)使用相同的包含(标准,但也包括其他一些)

我的问题是:如果我只在main.c中包含所有头文件,或者我应该让每个.h文件单独包含它们而不是将它们包含在我的main.c中,这是否可以(考虑到我只是使用那些头文件中的函数)?

或者我应该两个都做?

我现在的表现如下:

dist.c:

#include "dist.h"
#include  <stdio.h>
#include  <unistd.h>
#include  "rpiGpio.h"
#include <pthread.h>
#include  <wiringPi.h>
#include  <softPwm.h>

然后是另一个:

cmps.c:

#include "cmps.h"
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include "rpiGpio.h"

然后在我的main.c:

#include    <stdio.h>
#include    <stdlib.h>
#include    "dist.h"
#include    "cmps.h"

提前致谢!

2 个答案:

答案 0 :(得分:7)

您应该在自己的标头上方包含标准标头,并且应该包含该文件中文件的所有依赖关系。如果更改其中一个文件中的包含,则不应影响任何其他文件。每个文件都应该保留自己的标头依赖项列表。

如果在您的示例中dist.h包含<stdio.h>,则您不应该依赖dist.h之外的内容。如果您更改dist.h以使其不再依赖<stdio.h>并删除#include,那么您的计划会中断。

答案 1 :(得分:3)

我认为答案是“它取决于”。只要你保持一致,我认为没关系。不同方法的一些优点和缺点:

  1. 两次包含系统标题不会造成不利影响(由于标题保护);包括你自己的标题两次也不会导致问题,只要你使用标题保护。但是,可以说它可能会减慢编译速度。

  2. 在某些情况下,特别是在较旧的Unices上,包含标题的顺序很重要(遗憾的是)。有时#define s(例如#define _GNU_SOURCE的顺序#include有关。我也有这种情况发生在Linux包含文件的各种内部网络位置(我现在忘记了什么)。出于这个原因,最好始终以一致的方式包含您的系统包含(以及他们检查的#define)。

  3. 一种方法是将您的所有系统包含放在您自己的单个包含文件中,并将其包含在每个.c文件中;这会产生与autoconf及其生成的config.h相同的结果。但是,它可能会不必要地包含减慢编译速度的文件。

  4. 有人说put包括你自己的包含的系统标题。虽然这通常被认为是一种很好的做法,但如果您自己的.h文件引用类型在系统中定义包括,例如,它就不会很好。 stdint.h定义int32_t。如果仅在.h文件中包含该内容,则可能会回到包含订单的潜在问题以及您是否在正确的位置获得#define _GNU_SOURCE

  5. 因此,我的个人编码风格是config.h等效,所有.h文件都包含这些文件,并且(对于好的衡量标准)所有.c个文件都包含在内,其中包含所有相关系统包括。它不适合编译时,但这就是预编译头的用途。我通常按​​字母顺序排列系统,除非有理由不这样做。

  6. 另一种方法是(小心地)按文件进行,如@meagar建议的那样。