如何保证不包含iostream?

时间:2019-10-25 01:58:22

标签: c++ c++17 iostream iosfwd

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

是否有一种方法可以确保#include依赖关系树中没有文件具有#include -d <iostream>?理想情况下,这种方式会导致编译失败,例如static_assert

1 个答案:

答案 0 :(得分:2)

C ++不能在语言级别真正做到这一点。甚至评论中的某些建议(例如检查iostream标头的属性是否已经存在)都行不通。原因是报头不是孤立的。没有什么可以阻止.cpp文件包含iostream标头和您自己的标头。检查标头中的属性会产生误报,因为它不是包含标头的属性。

您的问题是关于一般的依赖关系图,这不是一种语言可以识别的C ++(至少在头文件方面)。而且,如果您拥有C ++ 20的模块...那么,您将不在乎,因为模块导入不会引起您要避免的问题。

因此,验证您要测试的内容的任何尝试最终都将基于构建系统中的某些内容,而不是语言。您最能做的就是转储哪些标头包括哪些其他标头,然后通过某种模式匹配来运行它以查找iostream标头。