2016-11-17 108 views
0

我正在开发中prj_cpp.h一个C++项目作为C++冲突的命名空间

// prj_cpp.h 
#include "lib_cpp.h" 
extern "C" { 
#include "lib_c.h" 
} 

lib_cpp.hlib_c.h分别头外部的C++和C库的文件,这开始。

外部C++库lib_cpp.h还以下面的方式使用lib_c

// lib_cpp.h 
namespace SOME_WEIRD_NAMESPACE { 
extern "C" { 
#include "lib_c.h" 
} 
} 

因为lib_c.h防止重包含,事实证明,在lib_c.h所有对象驻留在SOME_WEIRD_NAMESPACE这无关我的项目prj_cpp

在另一方面,如果我的头文件看起来像

// prj_cpp.h 
extern "C" { 
#include "lib_c.h" 
} 
#include "lib_cpp.h" 

我打破了外部C++项目,因为没有什么SOME_WEIRD_NAMESPACE下,因为我有lib_c.h第一。

我不允许修改既不lib_cpp.h也不lib_c.h

有什么我可以在我的prj_cpp.h如何解决这样的问题?

我不很喜欢在我的项目中使用SOME_WEIRD_NAMESPACE因为该命名空间无关,用它做。而且,lib_c.h头文件的数量可能很大。如果您使用lib_c.h超过lib_cpp.h使用下面的包装

// lib_c_wrapper.h 
namespace SOME_WEIRD_NAMESPACE { 
extern "C" { 
#include "lib_c.h" 
} 
} 

+2

lib_cpp.h已损坏。这是根本问题,修复它是正确的解决方法。 –

+0

同意,什么是适当的修复?防止在名称空间下使用lib_c.h? – TruLa

+0

编写新的非破坏版本的lib_cpp.h和lib_c.h,并使用它们代替原始文件。原件未经修改,因此分配规范仍然符合。 – user4581301

回答

1

如果使用lib_cpp.h比lib_c.h多,用下面的包装更换的#include lib_c.h:

// lib_cpp_wrapper.h 
#define SOME_WEIRD_NAMESPACE YOUR_NAMESPACE 
#include "lib_cpp.h" 

这是解决该问题的解决方法。

2

由于lib_cpp.h和lib_c.h来自第三方,这些图书馆可能会提供新的,不同的版本,这些文件的新版本,这将避免日后的维护问题,如果你不改变它们。你也声明你的规格是你不会改变它们的。因此,将它们包装起来并在您的代码中专门使用包装来解决问题。

是发生在我的第一种方法是:

//wrapped_lib_c.h 
#ifndef WRAPPED_LIB_C_INC_GUARD 
#define WRAPPED_LIB_C_INC_GUARD 

namespace SOME_WEIRD_NAMESPACE 
{ 
    extern "C" 
    {  
    #include "lib_c.h" 
    } 
} 

namespace SOME_PROJECT_APPROPRIATE_NAMESPACE 
{ 
    using SOME_WEIRD_NAMESPACE; 
} 

#endif 

//wrapped_lib_cpp.h 
#ifndef WRAPPED_LIB_CPP_INC_GUARD 
#define WRAPPED_LIB_CPP_INC_GUARD 

#include "lib_cpp.h" 

namespace SOME_PROJECT_APPROPRIATE_NAMESPACE 
{ 
    using SOME_WEIRD_NAMESPACE; 
} 
#endif 

这方面的一些变化应适用于您的情况,您需要维护的细节在你的包裹隔离文件。