当我创建一个将由多个开发人员使用的头文件时,根据其中使用的所有定义和声明,使该头文件自给自足是一种良好的编程习惯.
例如:
头文件1:types.h
#ifndef TYPES_H
#define TYPES_H
typedef unsigned int uint16
#endif
Run Code Online (Sandbox Code Playgroud)
头文件2:myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
uint16 myfunc(void);
#endif
Run Code Online (Sandbox Code Playgroud)
我在myheader.h中使用了uint16而没有包含types.h.因此,如果有人想在他们的源文件中包含myheader.h,他们应首先包含"types.h",然后包含"myheader.h".因此,这实际上是迫使开发人员按特定顺序包含头文件.我一直认为这是一种不好的做法,但我今天在我公司遇到了一些代码,在一个文件中声明了一个函数,你需要包含至少4个其他头文件.所以现在我很困惑,我错过了什么,是否有任何地方可以认为这是预期的行为.
用不必要的类型污染全局命名空间是不好的做法.您可以做的最好的事情是尽可能提供前向声明,并include在必要时提供其他文件.在简化的情况下,您应该包含在uint16使用它的每个标头中定义的标头.
例如,如果您可以向前声明类型,那么这是首选.理由是如果你实际上没有使用这种类型,前向声明就足够了.如果你确实使用了这个类型,你应该包含明确声明它的标题.