[英]C++ conflicting namespaces
我正在prj_cpp.h
開發一個C++
項目,開始於
// prj_cpp.h
#include "lib_cpp.h"
extern "C" {
#include "lib_c.h"
}
其中lib_cpp.h
和lib_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.h
和lib_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.