我正在 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
中的所有对象都驻留在与 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_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
这种方法的一些变体应该适用于您的情况,并且您需要维护的详细信息隔离在包装文件中。
关于C++ 命名空间冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40661863/