Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免向前重新声明。这是一种好的做法吗?有必要吗?_C++ - Fatal编程技术网

C++ 避免向前重新声明。这是一种好的做法吗?有必要吗?

C++ 避免向前重新声明。这是一种好的做法吗?有必要吗?,c++,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 正如您在文件2中所看到的,我试图保护A的转发声明。因此,不可能重新申报A 我见过很多代码,它们没有在转发声明周围设置防护 我想知道我所做的是否真的

我习惯于这样做类的转发声明:

// 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
正如您在
文件2中所看到的,我试图保护
A
的转发声明。因此,不可能重新申报A

我见过很多代码,它们没有在转发声明周围设置防护


我想知道我所做的是否真的有必要,或者它是否增加了某种安全性。这些方法中有哪一种比另一种更能提高编译时间?你会用哪一个?为什么?

您没有添加任何安全性。C++中的声明可以在任何时候重复,只要它们都是一致的。
此外,这不是一个好的做法。我从未见过有人这样做。想想如果将
A
的定义从
A.hpp
移动会发生什么:您应该更改
A
在所有文件中的转发声明周围的所有范围保护。生活已经够复杂了。

你没有增加任何安全。C++中的声明可以在任何时候重复,只要它们都是一致的。
此外,这不是一个好的做法。我从未见过有人这样做。想想如果将
A
的定义从
A.hpp
移动会发生什么:您应该更改
A
在所有文件中的转发声明周围的所有范围保护。生活已经够复杂了。

你不需要使用marco guard,因为编译器知道如何处理这两个文件

无需在file2.h中删除以下3行

#ifndef A_HPP
class A;
#endif
使用下面的行已经足够好了

#include "file1.h"
远期申报的概念

转发声明用于在读取文件时通知编译器有一个名为“a”的类(或结构或任何您想要的类型)。但编译器知道声明在这里不是特定的,但可能在另一个文件中

此时,编译器将知道:

1) 好的,有一个名为“a”的类,我会记住的

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

提前声明是有用的。尤其是班级是相互关联的

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


编译时间

转发声明也很好使用,因为它节省了编译时间

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


而文件2只使用转发声明,因此无论您如何更改文件1或类A,文件2都不会再次编译。

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

无需在file2.h中删除以下3行

#ifndef A_HPP
class A;
#endif
使用下面的行已经足够好了

#include "file1.h"
远期申报的概念

转发声明用于在读取文件时通知编译器有一个名为“a”的类(或结构或任何您想要的类型)。但编译器知道声明在这里不是特定的,但可能在另一个文件中

此时,编译器将知道:

1) 好的,有一个名为“a”的类,我会记住的

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

提前声明是有用的。尤其是班级是相互关联的

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


编译时间

转发声明也很好使用,因为它节省了编译时间

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


而文件2只使用转发声明,因此无论您如何更改文件1或类A,文件2都不会再次编译。

除非有循环引用,否则我看不出有什么意义;只要更换
\ifndef A\u水电站#带有
的endif
#包括“a.hpp”
。任何类型的编译时间好处都可能是微不足道的;只要更换
\ifndef A\u水电站#带有
的endif
#包括“a.hpp”
。任何类型的编译时间好处都可能可以忽略不计。那么编译时间呢。保证声明的连贯性不是需要时间吗?我不认为它增加了那么多时间值得关注。顺便说一句,你的检查不会增加编译时间吗?我不知道。谢谢你简洁的回答。编译时间呢。保证声明的连贯性不是需要时间吗?我不认为它增加了那么多时间值得关注。顺便说一句,你的检查不会增加编译时间吗?我不知道。谢谢你简洁的回答。