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

Should I, or should I not include the same headers in different c files, which in turn are headers used in a main file?

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

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

或者我应该两者都做?

我现在的做法是:

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"

提前致谢!

您应该在您自己的 header 之上包含标准 header,并且您应该在该文件中包含文件的所有依赖项。如果您更改其中一个文件中的包含,它应该不会影响任何其他文件。每个文件都应维护自己的 header 依赖项列表。

如果在您的示例中,dist.h 包含 <stdio.h>,您不应在 dist.h 之外依赖它。如果您更改 dist.h 使其不再依赖于 <stdio.h> 并删除 #include,那么您的程序将中断。

我认为答案是"it depends"。只要你是一致的,我认为就可以。不同方法的一些优点和缺点:

  1. 包含系统header两次不会造成不良影响(由于header守卫);如果你也使用 header 守卫,那么两次包含你自己的 headers 也不应该造成问题。但是,可以说它可能会减慢编译速度。

  2. 在某些情况下,尤其是在较旧的 Unice 上,header 的包含顺序很重要(很遗憾)。有时 #define 的顺序(例如 #define _GNU_SOURCE#include 相关。我也遇到过 Linux include 用于各种内部网络位的文件(我现在忘了是什么)。出于这个原因,最好始终以一致的方式包含您的系统包含(以及他们检查的 #defines)。

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

  4. 有人说把系统的包含 headers 放在你自己的包含之上。虽然这通常被视为良好做法,但如果您自己的 .h 文件引用系统中定义的类型包括,例如stdint.h 定义 int32_t。如果您将其单独包含在您的 .h 文件中,您将回到包含顺序的潜在问题以及您是否将 #define _GNU_SOURCE 放在正确的位置。

  5. 因此我的个人编码风格是有一个 config.h 等价物,它包含在所有 .h 文件和(为了更好的测量)所有 .c 文件中作为第一个include,它包含了所有相关的系统includes。它不是编译时间的理想选择,但这就是预编译 headers 的用途。我通常按​​字母顺序排列系统包含,除非有理由不这样做。

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