【发布时间】:2016-12-13 00:57:09
【问题描述】:
假设我有几个“h”文件:
First.h
struct FirstStruct { /* Stuff */ };
/* Other stuff */
第二个.h
#include "First.h"
struct SecondStruct {
FirstStruct member;
/* More other stuff */
};
/* Even more other stuff */
第三个.h:
#include "Second.h"
FirstStruct foo(void);
/* Other functions */
如果您注意到Third.h 没有直接获得FirstStruct 的定义(即从包含First.h),而是因为Second.h 包含它。问题是,当开发人员决定 SecondStruct 并不真正需要 FirstStruct 时,它需要半等效结构 OtherStruct,然后将 include 取出到 First.h ......现在糟糕了任何使用Third.h 的东西都不起作用。
如果您依赖其他 h 文件包含,是否有任何半标准编译器选项来警告您?
【问题讨论】:
-
(a) 搜索 IWYU — 包括您使用的内容。 (b) 当您进行更改时,应该有一个发现编译问题的测试。没有简单的解决方法。
-
编译器无论如何都会“爆炸”......因为如果没有正确的
#include,将无法找到Third.h中的FirstStruct声明。多个#include <...>对适当的警卫来说从来都不是问题。 -
@WhiZTiM 它只会在开发者没有将它包含在 Second.h 中时才会爆炸,如果我给它我现在拥有的它甚至不会退缩
-
如果有人故意更改 Second.h,他们不应该负责确保他们没有破坏构建吗?如果您的开发人员会定期提交对头文件的更改而不检查他们是否破坏了构建,那么您需要寻找新的开发人员。
-
@Peter 真正的问题是当 h 文件被深埋很多层时,开发人员对它为什么不编译感到非常困惑(显然他可以通过一些工作弄清楚)。但真正的问题是我们依赖的事实包括