如果前向声明似乎更优越,我们为什么要使用#includes?

时间:2016-03-29 01:59:27

标签: c++ c-preprocessor

我最近在C ++中遇到了前向声明的想法。我已经读过使用前向声明,可以通过避免不必要的声明和递归#includes来加快编译时间。然而,这让我感到疑惑,为什么有人使用#includes呢?

是否存在普通前瞻性声明不合理的情况?例如,如果你有一个库头文件,那么只需要一个#include然后命名每个类/函数原型就更有意义了吗?

我已经阅读了许多有关堆栈溢出的帖子,解释了每条路径之间的差异,但为什么要使用#includes?

2 个答案:

答案 0 :(得分:1)

包含标题而不是在整个代码中使用正向声明的主要原因是强制执行一致性,并且重复性最小。

考虑在几个cpp文件中使用的标头。当标题中的类或变量发生更改时,您需要查找并更改所有文件中的所有引用。否则,代码将继续编译,但无法链接。

此外,前向声明有其限制:它们允许您声明指向类或调用函数的指针,但它们不允许创建实例或访问其成员。

答案 1 :(得分:1)

只是您想到的前向声明不能替换标头中的声明。

一个明显的例子是类的声明:

假设我有一个Foo类,并且将包含Bar

这将有效

// FOO.H
class Bar;

class Foo {
private:
    Bar* bar;
};

但这不会:

// FOO.H
class Bar;

class Foo {
private:
    Bar bar;
};

很多情况下编译器需要知道“完整”声明(我们通常放在标题中)才能完成它的工作,而不仅仅是包含类名称的前向声明等(允许你主要创建指向此类的指针/引用)。