尽可能将所需要包含的头文件文件在.c文件中包含定义如:#inlcude “x.h”,除非头文件必须的部分申明出现在其他头文件中定义过的结构体或者宏定义类型,这时候没办法,只能在.h中包含.h。

具体分析这样定义的原因:

1. 减少编译展开所需时间

虽然头文件中都加入了

1
2
3
4
#ifndef __KEY_H
#define __KEY_H
...
#endif

一般编译不会再出现重定等错误,但是每次遇到#include的时候,都会将这段代码复制一边进行排查,而头文件多次被展开,会严重影响编译效率,且也没有什么好处。

2. 头文件的嵌套调用难免造成问题

两个.c文件相互调用彼此的内容是常有的事情,这时候如果处理不善则往往会遇到未声明之类的报错,这种情况需要你小心的调整#include”x.h”文件在编译过程中第一次出现的顺序。

1
2
3
4
5
6
7
8
9
10
11
12
举例:
a.h中存在#inlcude "b.h"
b.h中存在#inlcude "a.h"
而这时候a.h依赖于 b.h,但b.h直接被先包含在了main.c文件中,这时候往往会提示编译错误,原因是a.h中的一些内容未被申明定义。
具体解析:
编译器在编译的过程中,如果先从main.c文件开始执行,main.c中包含有b.h,而b.h中包含有a.h则展开为:
b.h(上部分极少数定义包含内容)
a.h(全部内容,因为#ifndef,所以b.h不会在a.h中再出现)
b.h(绝大多数内容)
因此,通过上述代码,在执行编译过程中,在编译a.h时则无法找到依赖b.h的一些相关定义。

直接将头文件文件相互写入到对方的头文件文件下这时候最容易出错。解决的办法一般是:1.将所有不需要写在头文件中的#inlcude写在#inlcude “.h”中。2.小心调整#inlcude “.h”的顺序,将需要依赖其他的那个调用放在后面,对于多次嵌套调用等情况,调整顺序时尤其需要注意顺序。