【发布时间】:2020-02-21 09:00:50
【问题描述】:
#include <iosfwd> in header files and #include <iostream> only in cpp files 被认为是最佳实践。我正在尝试将大量 #include <iostream> 从标头移动到现有项目中的 cpp 文件。
有没有办法保证#include 依赖树中没有文件有#include-d <iostream>?理想情况下,编译失败,如static_assert。
【问题讨论】:
-
如果您只是需要它作为快速测试而不是永久解决方案,请打开您本地的
iostream并查看是否有类似#define _IOSTREAM_的内容。如果是这样,请在测试包含时使用它。 -
在头文件中包含iostream没有任何问题。无时无刻不在发生。
-
我认为 gcc 定义了
_GLIBCXX_IOSFWD和_GLIBCXX_IOSTREAM。虽然无法与其他编译器交谈 -
我同意 Sam 的观点,以及关于为您的平台/编译器利用
iostream标头保护的其他建议(如果不关心可移植性)。另一个技巧是制作一个中毒的 iostream,它首先在包含搜索位置被拾取。或者只是在标题上使用grep来查找include.*iostream。 -
@SamVarshavchik:如果你是呢?许多项目都有数千个翻译单元。这就是 C++20 模块如此重要的原因。减少编译时间并不是一个不合理的问题;目前还不是 C++ 能解决的问题。