即使之前包含过,我是否应该包含每个标头?或者也许我应该尽可能避免它?
例如。如果我使用std::string
and std::vector
在某个文件中。如果<string>
包括<vector>
我应该只包括<string>
or <string>
and <vector>
?
TLDR
如果您使用它,请包含它。
更长的版本...
如果您在文件中使用与标头相关的实体(例如某种类型),则应包含其相关标头。不要依赖标头来相互包含。如果您使用它,请包含它.
C++ 标准库不强制包含<string>
in <vector>
反之亦然。尝试使用这样的功能会将代码限制为特定的实现。一般来说,标准库标头可能会或可能不会以未指定的顺序或方式包含其他标头(或其自己的内部标头)。一个值得注意的例外是<initializer_list>
这需要包含在一些其他标准标头 https://stackoverflow.com/q/26614983/3747990. 也可能发生对这种未指定的顺序或方式的更改,从而破坏先前使用更新的编译器或更新的标准库实现编译的代码(已知会发生这种情况).
还要考虑,如果头文件是类的定义,那么它应该包括该类的定义所需的内容。相关的.cpp
应包括其相关的.h
以及实现该类所需的其余文件。不需要它,不包含它;不要包含超出需要的内容(LLVM 风格指南 http://llvm.org/docs/CodingStandards.html#include-as-little-as-possible)。这里有一个例外是模板(没有关联的.cpp) https://stackoverflow.com/q/495021/3747990;此例外将适用于其他仅标头的实现。
值得注意的是的维护包括你使用的东西从长远来看可能会很困难;因此,在编码周期开始时包含接口所需的内容是很重要的;然后再次检查包含内容以及对代码所做的任何合理更改。
似乎有一些进展。这方面的工具,例如iwyu项目 https://code.google.com/p/include-what-you-use/,它使用 clang 工具链,并且似乎也支持 msvc。
One 反例如果标头的原因是包含其他标头,那么也许是这样,但即便如此,我也会非常小心 - 确保明确定义它包含的内容。预编译头就是一个例子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)