C++:包含来自不同命名空间的具有相同名称的多个头文件

deu*_*ger 7 c++ header include

如何通过包含与另一个包含的另一个头文件同名的头文件来创建解决方案?

例如:

// 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
Run Code Online (Sandbox Code Playgroud)

在最后一个头文件中,由于多个包含预处理器保护,因此不会包含a.hpp.真的,这应该没问题,因为类在不同的命名空间中.我意识到,简单的方法是只更改foo/a.hpp的名称或者只是在多重包含守护中给它一个假名.有没有更好的办法?

编辑 我理解你可以通过在#define和#ifndef指令中使用更具描述性的名称来解决这个问题(例如FOO_A_HPP和BLAH_A_HPP),但我想知道这是推荐的还是最好的方法.有些人会建议使用不同的文件名作为更好的解决方案,还是不重要?你会建议使用这个约定:

<NAMESPACE>_<CLASS>_HPP
Run Code Online (Sandbox Code Playgroud)

代替

<CLASS>_HPP
Run Code Online (Sandbox Code Playgroud)

一般来说,是否有更好的机会避免这些问题?

Goz*_*Goz 9

简单地说,通过不在顶部使用相同的#define来解决这个问题...

最好使用BLAH_A_HPP和FOO_A_HPP等,以便#define还包含命名空间名称.

编辑:我个人建议您执行以下操作:

1)不要将标题命名为相同(即使用不同的文件名...这并不总是有用)并使用不同的#define名称
.2)不要将类命名为相同的东西.为每个标题放置1个类,并在类
3 之后命名标题.如果它们由命名空间区分,则在文件名中使用该命名空间AND #define
4)为您添加一个特殊的ID(我可以使用GOZ)例如)
5)使用#pragma一次.它对编译器很有用.

这完全是品味问题.选择适合您的方案并坚持下去.没有对错.只要它有效并且一致.