簡體   English   中英

C ++沖突的名稱空間

[英]C++ conflicting namespaces

我正在prj_cpp.h開發一個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中的所有對象lib_c.h駐留在SOME_WEIRD_NAMESPACE ,這與我的項目prj_cpp沒有prj_cpp

另一方面,如果我的頭文件看起來像

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

我中斷了外部C++項目,因為SOME_WEIRD_NAMESPACE下沒有任何SOME_WEIRD_NAMESPACE因為我首先包含了lib_c.h

我不允許修改lib_cpp.hlib_c.h

我可以在prj_cpp.h做些什么來解決此問題?

我不太喜歡在項目中使用SOME_WEIRD_NAMESPACE ,因為該命名空間與它無關。 此外, lib_c.h頭文件的數量可能很大。

由於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

對此進行一些變型應適合您的情況,並且需要維護的細節在包裝文件中被隔離。

如果您使用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"

這是解決此問題的解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM