当我创建一个将由多个开发人员使用的头文件时,根据其中使用的所有定义和声明,使该头文件自给自足是一种良好的编程习惯。
例如:
头文件1:types.h
#ifndef TYPES_H
#define TYPES_H
typedef unsigned int uint16
#endif
头文件2:myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
uint16 myfunc(void);
#endif
我在myheader.h中使用了uint16而没有包含types.h。因此,如果有人想在他们的源文件中包含myheader.h,他们应首先包含“types.h”,然后包含“myheader.h”。因此,这实际上是迫使开发人员按特定顺序包含头文件。我一直认为这是一种不好的做法,但我今天在我的公司遇到了一些代码,在一个文件中声明了一个函数,你需要包含至少4个其他头文件。所以现在我很困惑,我错过了什么,是否有任何地方可以认为这是预期的行为。
答案 0 :(得分:5)
使用不必要的类型污染全局命名空间是不好的做法。您可以做的最好的事情是尽可能提供前向声明,并在必要时提供include
个其他文件。在简化的情况下,您应该在每个使用它的标头中包含定义uint16
的标头。
例如,如果你可以转发声明类型,那么这是首选。理由是如果你实际上没有使用这种类型,前向声明就足够了。如果您使用该类型,您应该包含明确声明的标题。
答案 1 :(得分:4)
你最好只在myheader.h中创建一些包含保护,然后创建#include "types.h"
。不要让别人思考(至少不是这样)。
答案 2 :(得分:3)
具体回答您的问题:是的,头文件应该是自给自足的。它应该包含所需的每个头文件,以允许它编译。
一般来说,大多数现代图书馆都有防护装置,因此编辑器只能“看到”头文件一次。先到先得。因此,不要太过于痴迷(尽管验证不会受到伤害)。
答案 3 :(得分:1)
公共标题应该提供使用它公开的接口所需的所有定义,仅此而已。
答案 4 :(得分:0)
这可能是一个惯例问题,但在几乎所有类似情况下myheader.h
#include types.h
一开始。
答案 5 :(得分:0)
所有标题都应该是自给自足的,除非用#error明确说明,除非定义了一些定义。
我总是将CPP文件的匹配标头作为第一个包含,以确保它们始终可编译。