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”
。任何类型的编译时间好处都可能可以忽略不计。那么编译时间呢。保证声明的连贯性不是需要时间吗?我不认为它增加了那么多时间值得关注。顺便说一句,你的检查不会增加编译时间吗?我不知道。谢谢你简洁的回答。编译时间呢。保证声明的连贯性不是需要时间吗?我不认为它增加了那么多时间值得关注。顺便说一句,你的检查不会增加编译时间吗?我不知道。谢谢你简洁的回答。