2012-10-07 19 views
3

我有一个简单的头文件,我转发 - 声明名称空间中的所有类,例如。你应该在前向声明头文件中使用#ifndef guard吗?

#ifndef TEST_FWD_HPP 
#define TEST_FWD_HPP 

namespace a { 
    namespace b { 

      class A; 
      class B; 

    } 
} 

#endif 

该文件是否应该防范多个包含(#ifndef ...)?这只对前向声明有意义吗?

回答

5

这样保护头文件通常是很好的做法。在大多数情况下,文件只包含一次是没有必要的,但是当项目变得复杂时,头文件包含在其他头文件中可以帮助保持理智。

如果你只有向前的定义,并在它的函数原型,那么它通常是没有必要的,但作为头文件会随着时间而acrete的东西,它往往是值得做的事情是理所当然的事。

2

多个包含警卫不仅服务多个声明错误。您需要在每个头文件中插入这些守卫,以避免无限循环。

+0

如果什么文件'X.hpp'包括这个'test_fwd.hpp'但它已经被其他地方包括在内。那么它会包含一个空文件,所以'A'和'B'类会不被声明? – emesx

+0

如果test_fwd.hpp已经被包含,那么你的守卫已经被定义了,它是你在同一个编译单元中的,所以'A'和'B'将被前面的包含声明。 – tomahh

2

只需使用一个(正式非标准)#pragma once,并用它做。

除了防止在同一个翻译单元中包含多个内容外,头文件或#pragma once让精明的编译器避免重新扫描文件。

+0

#杂注的本质是不便携的 – Julian

+3

@ Julian:你知道吗?*点击答案中的链接*?在评论之前,如何阅读你选择评论的内容?等等,谢谢,但不是非常感谢。 –

+0

作为链接指出:在C和C++编程语言,曾经的#pragma是非标准,但广泛支持的预处理指令... – Julian