【发布时间】:2010-09-10 20:06:27
【问题描述】:
如何解决通过包含一个与另一个头文件同名的头文件而创建的问题,该头文件已因另一个包含而间接包含?
例如:
// src/blah/a.hpp
#ifndef A_HPP
#define A_HPP
namspace blah
{
class A
{
}
}
#endif
// src/blah/b.hpp
#ifndef B_HPP
#define B_HPP
#includes "a.hpp"
namspace blah
{
class B
{
}
}
#endif
// src/foo/a.hpp
#ifndef A_HPP
#define A_HPP
namspace foo
{
class A
{
}
}
#endif
// src/foo/c.hpp
#ifndef C_HPP
#define C_HPP
#includes "../b.hpp"
#includes "a.hpp" // won't be included due to multiple inclusion prevention
namspace foo
{
class C
{
}
}
#endif
在最后一个头文件中,a.hpp 不会被包含,因为多重包含预处理器保护。确实,这应该没问题,因为这些类位于不同的名称空间中。我意识到最简单的方法是更改 foo/a.hpp 的名称,或者只是在多重包含保护中给它一个假名称。有没有更好的办法?
编辑 我了解您可以通过在 #define 和 #ifndef 指令中使用更具描述性的名称(例如 FOO_A_HPP 和 BLAH_A_HPP)来解决此问题,但我想知道这是否是推荐或最佳方式。有些人会建议使用不同的文件名作为更好的解决方案,还是真的不重要?你会推荐使用约定吗:
<NAMESPACE>_<CLASS>_HPP
而不是
<CLASS>_HPP
为了更好地避免这些问题?
【问题讨论】:
-
为什么这被标记为C?
-
我总是把命名空间放在我的守卫中。自动化工具会将 GUID 作为标头保护。重点是它们必须是唯一的(不仅在您的项目中,而且如果可能的话,最好在全世界所有文件中的所有维度上都是唯一的)。