C++ 命名空间冲突

标签 c++ 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 中的所有对象都驻留在与 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 头文件的数量可能很大。

最佳答案

由于 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/

相关文章:

javascript - 如何在Node.js中解释和执行异步javascript?

c++ - 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区

c++ - C++11/14 中的高效文件读取

c++ - socket.h 中::accept 的错误号在哪里

Python访问错误类的属性

reactjs - browserify 和 babel 命名空间错误 React

namespaces - CertificateWebRequestHandlerModifierOptions 位于哪个命名空间?

c++ - 二进制搜索给出的结果略有不准确

objective-c - 解决 Objective-C 命名空间冲突的最佳方法是什么?

php - SimpleXML - 使用先前声明的命名空间添加新节点 - 如何?