我正在构建一个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"
提前致谢!
答案 0 :(得分:7)
您应该在自己的标头上方包含标准标头,并且应该包含该文件中文件的所有依赖关系。如果更改其中一个文件中的包含,则不应影响任何其他文件。每个文件都应该保留自己的标头依赖项列表。
如果在您的示例中dist.h
包含<stdio.h>
,则您不应该依赖dist.h
之外的内容。如果您更改dist.h
以使其不再依赖<stdio.h>
并删除#include
,那么您的计划会中断。
答案 1 :(得分:3)
我认为答案是“它取决于”。只要你保持一致,我认为没关系。不同方法的一些优点和缺点:
两次包含系统标题不会造成不利影响(由于标题保护);包括你自己的标题两次也不会导致问题,只要你使用标题保护。但是,可以说它可能会减慢编译速度。
在某些情况下,特别是在较旧的Unices上,包含标题的顺序很重要(遗憾的是)。有时#define
s(例如#define _GNU_SOURCE
)的顺序与#include
有关。我也有这种情况发生在Linux包含文件的各种内部网络位置(我现在忘记了什么)。出于这个原因,最好始终以一致的方式包含您的系统包含(以及他们检查的#define
)。
一种方法是将您的所有系统包含放在您自己的单个包含文件中,并将其包含在每个.c
文件中;这会产生与autoconf
及其生成的config.h
相同的结果。但是,它可能会不必要地包含减慢编译速度的文件。
有人说put包括你自己的包含的系统标题。虽然这通常被认为是一种很好的做法,但如果您自己的.h
文件引用类型在系统中定义包括,例如,它就不会很好。 stdint.h
定义int32_t
。如果仅在.h
文件中包含该内容,则可能会回到包含订单的潜在问题以及您是否在正确的位置获得#define _GNU_SOURCE
。
因此,我的个人编码风格是config.h
等效,所有.h
文件都包含这些文件,并且(对于好的衡量标准)所有.c
个文件都包含在内,其中包含所有相关系统包括。它不适合编译时,但这就是预编译头的用途。我通常按字母顺序排列系统,除非有理由不这样做。
另一种方法是(小心地)按文件进行,如@meagar建议的那样。