如何保证不包含 iostream?

How to guarantee that iostream wasn't included?

#include <iosfwd> in header files and #include <iostream> only in cpp files 被认为是最佳实践。我正在尝试将很多 #include <iostream> 从 header 移动到现有项目中的 cpp 文件。

有没有办法保证 #include 依赖树中的文件没有 #include-d <iostream>?理想情况下,编译会失败,例如 static_assert.

C++ 无法在语言级别真正做到这一点。甚至评论中的一些建议,比如检查 iostream header 的 属性 是否已经存在,也行不通。原因是 header 不是孤立的;没有什么可以阻止 .cpp 文件包含一个 iostream header,然后是您自己的 header。检查 header 中的 属性 会给出误报,因为它不是包含它的 header。

你的问题是关于一般依赖图的,这不是 C++ 语言所识别的东西(至少,就 header 而言不是)。如果你有 C++20 的模块……好吧,你不会在意,因为模块导入不会导致你试图避免的问题。

因此,任何验证您要测试的内容的尝试最终都将基于构建系统中的某些内容,而不是语言。您最多可以做的是获取转储,其中 headers 包括其他 headers,并且 运行 通过某种模式匹配来查找 iostream headers。