【问题标题】:two different libraries using the same name types使用相同名称类型的两个不同库
【发布时间】:2018-07-10 00:59:08
【问题描述】:

我正在使用两个不同的 c++ 库。两个库都使用一个类型的名称,比如说,称为 fofo。 在 lib1.h 中:

typedef short fofo;

在 lib2.h 中:

namespace LIB2
{

    typedef struct
    {
        uint16_t toto;    
    } fofo;
}
using LIB2::fofo;

我有一个使用这两个库的 C++ 项目/VS 2008: 当我在我的项目中做时

#include lib1.h

我收到错误:错误 C2874:使用声明导致多重声明

我想在我的项目中使用这两个库,但不对这些库进行任何更改。我唯一可以修改的是我的 VS2008 项目。感谢您的帮助!

【问题讨论】:

  • 这就是为什么用全局 using 指令来清除命名空间是个坏主意。
  • 请注意,这些名称都不是变量。两者都是类型。
  • 嗨乔纳森,我刚刚更新了我的问题。 Lib2 使用命名空间,但在 lib1 中的 fofo 中只是一个全局变量。谢谢
  • 让我们从“fofo”都不是变量的事实开始。细节很重要。当面对棘手的 C++ 集成情况时,充分理解什么是什么以及什么是什么是至关重要的。如果您并不真正了解 C++ 的工作原理,那么您几乎不可能为棘手的 C++ 问题找到解决方案。这里,第一个“fofo”不是一个变量,而是一个类型。而第二个“fofo”也不是一个变量,而是一个类型,它也被导入到全局命名空间中。现在,一旦你完全理解了所有这些是什么,现在你就可以开始弄清楚如何处理它了。
  • 修复也取决于细节。没有法律规定仅仅因为您有一个必须使用这两个库的项目,您就必须 #include 来自同一个 C++ 源文件中的两个库的头文件。首选的解决方案是在您的 C++ 源代码中仅使用这些头文件中的一个,并拥有不同的代码部分,每个部分都使用这些库中的一个,通过通用 API 进行交谈或通信。或者,也许使用预处理器技巧,就像有人建议的那样。但是没有任何你可以按下的神奇按钮,让符号冲突自行消失。你必须实现它。

标签: c++ conflicting-libraries


【解决方案1】:

这个(肮脏的)解决方法可能会起作用(取决于标题的使用方式)

不要直接包含lib1.h,而是通过制作一个新的头文件来包装它

lib1wrapped.h

#define fofo fofo_wrap
#include "lib1.h" // OR <lib1.h>
#undef fofo

【讨论】:

  • 不是直接包含 lib1.h ,而是像我展示的那样包装它。由于 fofo 只是一个 typedef 而不是一个真正的类型,没有什么真正改变,但错误应该消失。
  • 看来它解决了问题。现在它编译了。明天我会尝试使用这些库,并告诉你进展如何......谢谢!
  • 注意这仅适用于 fofo 是别名或 typedef !无论是变量还是真实类型,这都行不通!
  • 当我将 lib1wrapped.h 文件添加到项目的头文件中时,它会为许多其他变量生成其他错误(C2371 错误:重新定义;不同的基本类型)。我按照您对 fofo 的建议包装了其中一些变量,但它会产生更多错误。我想知道是否有更好的方法...
  • 令人惊讶的是,当我将此标头添加到 *.cpp 时,它不会导致任何问题...
猜你喜欢
  • 2014-12-13
  • 2020-10-20
  • 2011-06-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多