【问题标题】:C++ conflicting namespacesC++ 冲突的命名空间
【发布时间】:2016-11-17 17:56:49
【问题描述】:

我正在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?
  • 编写新的、未损坏的 lib_cpp.h 和 lib_c.h 版本,并使用它们代替原始版本。原件未经修改,因此仍符合分配规范。
  • 好的,lib_cpp.h 的完整版本应该是什么样子的?永远不要在命名空间子句下使用 C 头文件?
  • 头文件不是库!

标签: c++ namespaces


【解决方案1】:

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

其中的一些变体应该适用于您的情况,并且您需要维护的细节在您的包装文件中被隔离。

【讨论】:

    【解决方案2】:

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

    这是解决问题的解决方法。

    【讨论】:

      猜你喜欢
      • 2012-12-18
      • 2021-11-22
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2013-01-26
      相关资源
      最近更新 更多