【问题标题】:How to deal with library not using namespaces如何处理不使用命名空间的库
【发布时间】:2016-06-02 01:51:45
【问题描述】:

在我的项目中,我必须使用其符号不在命名空间中的库。该库的类具有相当短的通用名称,例如LoggerReader。我还在我的项目自己的类中使用了其中一些名称。

考虑我的项目符号也没有命名空间的情况。名称冲突可以通过将我的代码放在命名空间中并使用限定名称(例如::LoggerMy::Logger)进行区分来解决,但我更希望库的符号也被命名空间。有什么方法可以将库的符号“强制”到我选择的命名空间中?

其次,如果我想使用两个不同的库,它们都定义了一个非命名空间Logger。在这种情况下有什么方法可以避免命名空间冲突吗?

【问题讨论】:

  • 你可以很容易地将它强制到一个命名空间中,但是库将不再链接。请改用电话,请图书馆作者解决此问题。
  • 你在处理什么样的库?只有标题?访问源代码?预编译?
  • 修复根本问题。该库忘记使用名称空间。让他们修复它。
  • @John_West:不,如果包含预编译,不要包装它。它只会导致无法解析的外部符号,因为库是在没有命名空间的情况下编译的。
  • “我项目的符号也没有命名空间。” - 我不明白这一点。您亲身体验了全局命名空间中的名称是如何造成麻烦的,但您仍然拒绝自己做正确的事情?!

标签: c++ namespaces


【解决方案1】:

有什么方法可以将库的符号“强制”到我选择的命名空间中?

不,你真的不能那样做。我可以想象的一种方法是提供一个包装 API,它实际上使用 namespace 并从不同的名称(如 LoggerExt)转发。

如果我想使用两个不同的库,它们都定义了一个非命名空间的Logger,该怎么办?

你迷路了,至少链接器会告诉你。

【讨论】:

    【解决方案2】:

    据我所知,您有 4 个选项:

    • 确保所有代码都在命名空间中。 (这应该是给定的)
    • 联系指定库的开发人员,让他们知道它正在等待并希望更新版本。 (适当的沟通和耐心)
    • 自己重写整个库,将其完全封装在命名空间中。 (祝你好运,除非你知道自己在做什么)
    • 找到一个新的、更好的库,它可以与您当前使用的库相媲美,它将提供您需要的所有设计良好的功能。 (涉及大量研究、家庭作业和阅读,但最终可能会有所收获)

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 2021-08-02
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2012-01-06
      • 2011-05-14
      • 2014-09-19
      • 2021-07-27
      相关资源
      最近更新 更多