是否应该包含每个标题,即使它之前已包含在内?或者我应该尽可能避免它?
例如。如果我使用 std::string
和 std::vector
在某个文件中。如果 <string>
包括<vector>
我应该只包括<string>
或 <string>
和 <vector>
?
最佳答案
TLDR
如果你使用它,包括它。
更长的版本...
如果您在文件中使用与 header 相关的实体(例如某些类型),则应为其包含相关 header 。不要依赖标题来相互包含。 如果您使用它,请包含它。
C++ 标准库不强制包含 <string>
在 <vector>
反之亦然。尝试使用这样的功能会将代码限制为特定的实现。通常,标准库头文件可能会或可能不会以未指定的顺序或方式包含其他头文件(或它们自己的内部头文件)。一个值得注意的异常(exception)是 <initializer_list>
必须包含在 few of the other standard headers 中. 这种未指定的顺序或方式也可能发生更改,从而破坏以前使用更新的编译器或更新的标准库实现编译的代码(已知会发生这种情况)。
还要考虑如果头文件是类的定义,那么它应该包含该类定义所需的内容。关联的.cpp
应包括其关联的.h
以及实现该类所需的其余文件。 不需要,不要包含它;不要包含超出需要的内容 (llvm style guide)。这里的一个异常(exception)是 templates (that don't have an associated .cpp
) ;此异常将适用于其他仅 header 实现。
请注意,维护包括您使用的内容从长远来看可能很困难;因此,在编码周期的开始包含接口(interface)所需的内容是很重要的;然后再次检查包含对代码所做的任何合理更改。
似乎有一些进展w.r.t。这方面的工具,例如 iwyu project ,它使用 clang 工具链,并且似乎也支持 msvc。
一个反例是如果标题的原因是包含其他标题,那么可能,但即使这样我也会非常小心 - 确保明确定义它包含的内容。这方面的一个示例可能是预编译的 header 。
关于c++ - 我应该包括每个标题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26611481/