C++ 如何保证iostream不是';不包括在内?
这被认为是最佳实践。我正在尝试将现有项目中的许多C++ 如何保证iostream不是';不包括在内?,c++,c++17,iostream,iosfwd,C++,C++17,Iostream,Iosfwd,这被认为是最佳实践。我正在尝试将现有项目中的许多#include从头文件移动到cpp文件 有没有办法保证依赖关系树中的任何文件都没有包含?理想情况下,编译会失败,比如static\u assertC++在语言级别上不能真正做到这一点。即使是评论中的一些建议,比如检查iostream头的属性是否已经存在,也不会起作用。原因是标头不是孤立的;没有任何东西可以阻止.cpp文件在包含iostream头之后再加上您自己的头。检查标头中的属性会给出一个假阳性,因为它不是包含它的标头 你的问题是关于一个一般的
#include
从头文件移动到cpp文件
有没有办法保证依赖关系树中的任何文件都没有包含?理想情况下,编译会失败,比如
static\u assert
C++在语言级别上不能真正做到这一点。即使是评论中的一些建议,比如检查iostream头的属性是否已经存在,也不会起作用。原因是标头不是孤立的;没有任何东西可以阻止.cpp文件在包含iostream头之后再加上您自己的头。检查标头中的属性会给出一个假阳性,因为它不是包含它的标头
你的问题是关于一个一般的依赖图,它不是一个C++语言所能识别的东西(至少不是关于标题的问题)。如果你有C++20的模块。。。好吧,你不会在意的,因为模块导入不会导致你试图避免的问题
因此,任何验证您要测试的内容的尝试最终都将基于构建系统中的某些内容,而不是语言。您所能做的最多就是获取一个转储,其中包含哪些其他头,并通过一些模式匹配来查找iostream头。如果您只是需要它作为一个快速测试,而不是一个永久解决方案,请打开您的本地
iostream
,看看是否有类似于\define\iostream
的内容。如果是这样,那么在测试include时使用它。在头文件中包含iostream没有什么错。我认为gcc定义了\u GLIBCXX\u IOSFWD
和\u GLIBCXX\u IOSTREAM
。无法与其他编译器交谈,尽管我同意Sam,以及其他关于为您的平台/编译器利用iostream
头保护的建议(如果不考虑可移植性)。另一个技巧是制作中毒的iostream,首先在include搜索位置获取。或者在头上使用grep
查找include.*iostream
@SamVarshavchik:如果是这样呢?许多项目有数千个翻译单元。这就是为什么C++20模块如此重要的原因。减少编译时间不是一个不合理的问题;目前还没有一个C++可以解决。实际上,删除<代码> <代码> />代码> <代码>可能不值得,因为其他的头都是重的。