【问题标题】:namespace conflict in CC中的命名空间冲突
【发布时间】:2013-01-18 04:44:10
【问题描述】:

我在我的项目中定义了list_t,它获得了list_pop() 之类的列表模块API。但是现在我必须使用 MySQL lib 与 DB 进行通信,但是 MySQL lib 仍然得到了它的 list implements,并且还定义了一个list_pop() API。在我的其他模块中,我必须将它们都链接起来,然后冲突就来了。

我的一个解决方案是,分别包含用于不同列表API调用的头文件,这很好用,但是虽然某些函数需要同时调用MySQL::list_pop()local::list_pop(),如何通知编译器正确的链接点?是否有一些 GCC 技巧可以local::list_pop() 进行任何更改

【问题讨论】:

  • local::list_pop() 仅在您使用 c++ 更改标签时在 c++ 中有效。
  • 是的,我知道,我只是借用了 C++ 语法,想让我的问题更生动。
  • 您可以重命名您的 list_pop 或使用一些宏技巧。宏会让你的代码有点吓人,所以我就把它重命名为 tbh。
  • @JesusRamos: 改变我的列表实现是首选,但是有一些代码依赖它,而 MySQL::list 只在一个模块中使用,所以我不想要更改我的列表的命名。
  • 另一种可能性:你能简单地在任何地方使用 MySQL 列表类型而不是你自己的吗?由于您正在使用 MySQL 进行构建,这可能是一种可能性——但可能并不实用。

标签: mysql c list gcc compiler-construction


【解决方案1】:

出于大多数实际目的,您将不得不重命名一个或另一组函数。自己重命名可能比 MySQL 更容易。

最简单的方法是简单地添加一个具有较高唯一性(足够)可能性的前缀,例如您的姓名首字母,或您的项目的代号,或其他东西。或者您可以重命名所有内容以避免冲突,注意 MySQL 将来可能会添加新功能。

这正是为 C++ 发明命名空间的原因,以及 C 项目通常在函数集上具有系统前缀的原因。

【讨论】:

    【解决方案2】:

    有办法解决这个问题。将 your list_pop() 重构为 my_list_pop()。

    还有另一种方法可以解决这个问题,

    在这里查看 MySQL my_list.h 的标头,https://github.com/lgsonic/mysql-trigger/blob/master/mysql/my_list.h 您可以看到 list_pop 只是一个宏,它在编译时绑定,而不是在运行时绑定(因此不是真正的库函数)。将 MySQL 的 list_pop 更改为 list_pop_my(就在 #define 中)可以让它做你想做的事情。

    【讨论】:

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