为什么包含头文件这么邪恶?

Jon*_*Jon 12 c++ header-files forward-declaration

我已经看到很多关于何时使用前向声明而不是包含头文件的解释,但是很少有人解释为什么这样做很重要.我见过的一些原因包括:

  • 编译速度
  • 降低头文件管理的复杂性
  • 删除循环依赖项

来自.net背景我发现标题管理令人沮丧.我有这种感觉我需要掌握前向声明,但到目前为止我一直在报废.

为什么编译器不能为我工作并使用一种机制(包括)找出我的依赖关系?

前向声明如何加速编译,因为在某些时候引用的对象需要编译?

我可以购买降低复杂性的论据,但这样做的实际例子是什么呢?

Cub*_*bbi 19

"掌握前瞻性声明"不是必要条件,它是可行的有用指南.

当包含头文件并且它引入更多头文件时,编译器必须在处理单个翻译模块时进行大量工作.

你可以看到多少,例如gcc -E:

单个#include <iostream>为我的g ++ 4.5.2提供额外的18,560行代码来处理.

A又#include <boost/asio.hpp>增加了74,906行.

A #include <boost/spirit/include/qi.hpp>增加154,024行,超过5 MB的代码.

这加起来,特别是如果不小心包含在项目的每个文件中包含的某个文件中.

有时候翻阅旧代码并修剪不必要的代码会因此而大大改进编译.替换包括转换模块中的前向声明,其中仅使用对某个类的引用或指针,进一步改进了这一点.