【发布时间】: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 进行交谈或通信。或者,也许使用预处理器技巧,就像有人建议的那样。但是没有任何你可以按下的神奇按钮,让符号冲突自行消失。你必须实现它。