C ++冲突的命名空间

时间:2016-11-17 17:56:50

标签: c++ namespaces

我正在C++开发一个prj_cpp.h项目,该项目以

开头
// 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.hlib_c.h

我可以在prj_cpp.h中解决此类问题吗?

我不太喜欢在我的项目中使用SOME_WEIRD_NAMESPACE因为该命名空间与它无关。此外,lib_c.h头文件的数量可能很大。

2 个答案:

答案 0 :(得分: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

这种情况的某些变化应该适用于您的情况,您需要维护的详细信息将在包装文件中隔离。

答案 1 :(得分:1)

如果您使用lib_cpp.h而不是lib_c.h,请将#include lib_c.h替换为以下包装器:

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

如果使用lib_c.h而不是lib_cpp.h,请使用以下包装器:

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

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