我应该还是不应该在不同的 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"。只要你是一致的,我认为就可以。不同方法的一些优点和缺点:
包含系统header两次不会造成不良影响(由于header守卫);如果你也使用 header 守卫,那么两次包含你自己的 headers 也不应该造成问题。但是,可以说它可能会减慢编译速度。
在某些情况下,尤其是在较旧的 Unice 上,header 的包含顺序很重要(很遗憾)。有时 #define
的顺序(例如 #define _GNU_SOURCE
) 与 #include
相关。我也遇到过 Linux include 用于各种内部网络位的文件(我现在忘了是什么)。出于这个原因,最好始终以一致的方式包含您的系统包含(以及他们检查的 #define
s)。
一种方法是将所有系统包含文件放入您自己的单个包含文件中,并从每个 .c
文件中包含它们;这产生的结果与使用 autoconf
及其生成的 config.h
得到的结果几乎相同。但是,它可能会不必要地包含会减慢编译速度的文件。
有人说把系统的包含 headers 放在你自己的包含之上。虽然这通常被视为良好做法,但如果您自己的 .h
文件引用系统中定义的类型包括,例如stdint.h
定义 int32_t
。如果您将其单独包含在您的 .h
文件中,您将回到包含顺序的潜在问题以及您是否将 #define _GNU_SOURCE
放在正确的位置。
因此我的个人编码风格是有一个 config.h
等价物,它包含在所有 .h
文件和(为了更好的测量)所有 .c
文件中作为第一个include,它包含了所有相关的系统includes。它不是编译时间的理想选择,但这就是预编译 headers 的用途。我通常按字母顺序排列系统包含,除非有理由不这样做。
另一种方法是(小心地)按照@meagar 的建议按文件进行。
我正在构建一个 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"。只要你是一致的,我认为就可以。不同方法的一些优点和缺点:
包含系统header两次不会造成不良影响(由于header守卫);如果你也使用 header 守卫,那么两次包含你自己的 headers 也不应该造成问题。但是,可以说它可能会减慢编译速度。
在某些情况下,尤其是在较旧的 Unice 上,header 的包含顺序很重要(很遗憾)。有时
#define
的顺序(例如#define _GNU_SOURCE
) 与#include
相关。我也遇到过 Linux include 用于各种内部网络位的文件(我现在忘了是什么)。出于这个原因,最好始终以一致的方式包含您的系统包含(以及他们检查的#define
s)。一种方法是将所有系统包含文件放入您自己的单个包含文件中,并从每个
.c
文件中包含它们;这产生的结果与使用autoconf
及其生成的config.h
得到的结果几乎相同。但是,它可能会不必要地包含会减慢编译速度的文件。有人说把系统的包含 headers 放在你自己的包含之上。虽然这通常被视为良好做法,但如果您自己的
.h
文件引用系统中定义的类型包括,例如stdint.h
定义int32_t
。如果您将其单独包含在您的.h
文件中,您将回到包含顺序的潜在问题以及您是否将#define _GNU_SOURCE
放在正确的位置。因此我的个人编码风格是有一个
config.h
等价物,它包含在所有.h
文件和(为了更好的测量)所有.c
文件中作为第一个include,它包含了所有相关的系统includes。它不是编译时间的理想选择,但这就是预编译 headers 的用途。我通常按字母顺序排列系统包含,除非有理由不这样做。另一种方法是(小心地)按照@meagar 的建议按文件进行。