【问题标题】:include old library in C++ namespace在 C++ 命名空间中包含旧库
【发布时间】:2018-02-28 17:14:42
【问题描述】:

我试图在一个更大的项目中使用两个旧的(和不同的)usb 库,方法是将它们封装到自己的命名空间中,如下所示:

namespace usbA {
#include "/msp430/usb.h"
}
namespace usbB {
#include "/cypress/usb.h"
}

这显然会导致链接器错误,因为实际库中的名称没有像函数调用那样使用命名空间进行修饰。 这可以在不编辑库代码的情况下解决吗? 根据其他一些海报的答案,这是无法做到的。这就引出了一个问题,那么命名空间有什么用?如果我必须进入并修改库源代码,我也可以在每个函数前加上“usbA_”而不是使用命名空间。它同样不灵活。

【问题讨论】:

  • 您可以使用objcopy--redefine-sym 之类的工具来重命名.so 中的例程。我对 Windows 符号重新映射不够熟悉,无法在该区域提供选项。

标签: c++ header namespaces


【解决方案1】:

这显然会导致链接器错误,因为实际库中的名称没有像函数调用那样使用命名空间进行修饰。这可以在不编辑库代码的情况下解决吗?

我敢肯定会有可怕的方法来破解它,但我真的只是……不会。在我看来,它一定会以眼泪收场。

如果您真的需要这两个库,并且它们的名称确实冲突,我认为总的来说,您最好分叉它们并自己给它们命名空间。

这引出了一个问题,命名空间有什么用处?

如果您不使用它们,它们将毫无用处(C 代码显然不会使用它们)。如果这些库是带有命名空间的 C++ 项目,那么您就不会遇到这个问题,这对很多人都有好处。

同样不灵活

这就是 C++ 引入命名空间的原因。遗憾的是你不能强迫每个人都写 C++。

【讨论】:

  • “很遗憾,你不能强迫每个人都写 C++。” 不敢相信我这么说
  • 如果这些库是带有命名空间的 C++ 项目,那么您就不会遇到这个问题。那个怎么样?例如,如果它们都是 C++ USB 库并且它们都使用命名空间“USB”,那么你就会陷入同样的​​混乱。例如,我不能将一个库命名空间修改为“usbA”,可以吗?我将不得不进入并修改库的实际源以更改名称空间。如果我再次这样做,我也可以使用旧学校前缀而不是名称空间并以这种方式编辑库。命名空间给了我什么?我不能用我想要的方式封装一个库。
  • @dsula:好吧,当然,如果两个库选择了 same 命名空间名称,那么您又回到了原点,但明智的开发人员不会使用这些琐碎的名称。如果您有一个替代建议可以以某种方式普遍解决所有已知和未知案例的名称冲突,请随时向标准委员会提出建议,但老实说,您似乎只是在抱怨。究竟什么是“[你]想要的方式”?
  • 不,我不是在抱怨 :-)。我在想。我第一次使用这个命名空间的东西,可能我很无知,但对我来说,它并没有做我认为有用的功能。我可以通过为每个库函数和类名添加前缀来获得相同的功能。但话又说回来,我并不是真正的 C++ 高级用户。所以也许有不同的优势,我没有看到。同时我猜你回答了我的问题:如果不修改所述库的源代码,就不可能将遗留库封装在命名空间中。太糟糕了。
  • @dsula: “我可以通过为每个库函数和类名添加前缀来获得相同的功能” Ish,但这明显更笨拙,并且没有给出范围界定名称查找的任何好处。
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 2011-02-08
  • 1970-01-01
  • 2015-10-09
  • 2019-11-15
  • 1970-01-01
  • 2014-09-06
  • 2011-07-24
相关资源
最近更新 更多