避免向前重新声明。这是一个好习惯吗?有必要吗?

时间:2015-10-09 14:54:37

标签: c++

我习惯于对这样的类进行前向声明:

// file 1
#ifndef A_HPP
#define A_HPP

class A
{
    ...
};

#endif

// file 2
#ifndef B_HPP
#define B_HPP

#ifndef A_HPP
class A;
#endif

class B
{

};

#endif

正如您在file 2中所看到的,我尝试保护A的前向声明。因此,不应该重新声明A。

我看过很多代码,他们没有把守卫放在前方声明中。

我想知道我在做什么是非常必要的,或者是否增加了某种安全性。这些方法中的任何一种都会比其他方法更有利于编译时间吗?你会用哪一个?为什么呢?

2 个答案:

答案 0 :(得分:3)

你没有增加任何安全性。 C ++中的声明可以随时重复,只要它们都是连贯的。

此外,这不是一个好习惯。我从未见过有人那样做过。想想如果从A移动a.hpp的定义会发生什么:你应该在所有文件中更改A前向声明的所有范围保护。生活已经足够复杂了。

答案 1 :(得分:2)

您不需要使用marco防护,因为编译器将知道如何处理这两个文件。

无需在file2.h中输出以下3行

#ifndef A_HPP
class A;
#endif

使用以下行已经足够

#include "file1.h"

前瞻性声明的概念

前向声明用于通知编译器有一个类(或结构或任何你想要的类型)命名为" A"在阅读文件时。但编译器知道声明在这里不具体,但可能在另一个文件中。

那时,编译器会知道:

1)好的,有一个名为" A"的课程,我会记住它。

2)我不知道它的大小和细节。但是如果编码器只使用A *(A的指针),那就可以了,我不需要知道A的细节。

前向声明很有用。特别是课程是相互关联的。

但是,如果A的类型名称在两个文件之间不同步。 g ++将无法编译。

编制时间

前向声明也很好用,因为它可以节省编译时间。

如果文件没有改变,g ++将不会再次重新编译。

虽然文件2只使用前向声明,但无论你如何更改文件1或类A,文件2都不会再次编译。