我有一个简单的头文件,我转发 - 声明名称空间中的所有类,例如。你应该在前向声明头文件中使用#ifndef guard吗?
#ifndef TEST_FWD_HPP
#define TEST_FWD_HPP
namespace a {
namespace b {
class A;
class B;
}
}
#endif
该文件是否应该防范多个包含(#ifndef
...)?这只对前向声明有意义吗?
我有一个简单的头文件,我转发 - 声明名称空间中的所有类,例如。你应该在前向声明头文件中使用#ifndef guard吗?
#ifndef TEST_FWD_HPP
#define TEST_FWD_HPP
namespace a {
namespace b {
class A;
class B;
}
}
#endif
该文件是否应该防范多个包含(#ifndef
...)?这只对前向声明有意义吗?
这样保护头文件通常是很好的做法。在大多数情况下,文件只包含一次是没有必要的,但是当项目变得复杂时,头文件包含在其他头文件中可以帮助保持理智。
如果你只有向前的定义,并在它的函数原型,那么它通常是没有必要的,但作为头文件会随着时间而acrete的东西,它往往是值得做的事情是理所当然的事。
多个包含警卫不仅服务多个声明错误。您需要在每个头文件中插入这些守卫,以避免无限循环。
只需使用一个(正式非标准)#pragma once
,并用它做。
除了防止在同一个翻译单元中包含多个内容外,头文件或#pragma once
让精明的编译器避免重新扫描文件。
如果什么文件'X.hpp'包括这个'test_fwd.hpp'但它已经被其他地方包括在内。那么它会包含一个空文件,所以'A'和'B'类会不被声明? – emesx
如果test_fwd.hpp已经被包含,那么你的守卫已经被定义了,它是你在同一个编译单元中的,所以'A'和'B'将被前面的包含声明。 – tomahh