我正在阅读 Herb Sutter 的文章More Exceptional C++
,关于前向声明的第 37 项说:
#include
当前向声明就足够时,永远不要使用标题。仅在不需要流的完整定义#include
时才使用。<iosfwd>
此外,我听到了很多关于仅包含编译单元所需的头文件以减少依赖关系的建议。
我完全理解为什么这应该适用于项目标题,但我不太明白为什么包含不必要的标准标题是不好的。
例如我做这样的事情:
//standard_library.h
#ifndef STANDARD_LIBRARY
#define STANDARD_LIBRARY
#include <iostream>
#include <chrono>
#include <thread>
...
// Everything I need in the project
#endif
并在任何地方包含这个单一的标题,我需要一些东西std
我能想象的问题是:
- 不需要在 std 命名空间中的 C 库函数污染命名空间。
- 编译时间较慢
但到目前为止,我还没有遇到 1. 的重大问题。几乎所有东西都在 std 命名空间中。我也不完全理解为什么 2. 必然是一个重大问题。标准标题很少更改。据我所知,编译器可以预编译它们。当涉及到模板时,它们仅在我需要它们时才被实例化(编译)。
还有好处:
- 少打字
- 少读书
- 不太清楚我需要哪些标头以及某个功能在哪个标头中
我是一个没有大型项目经验的初学者程序员,我真诚地想弄清楚这一点,所以请怜悯我。