我正在C++
开发一个prj_cpp.h
项目,该项目以
// 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
中的所有对象都位于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
头文件的数量可能很大。
答案 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"
这是解决问题的解决方法。