2

list_t在我的项目中定义了列表模块 API,例如list_pop(). 但是现在我必须使用 MySQL lib 与 DB 进行通信,但是 MySQL lib 仍然有它的列表实现,并且还定义了一个list_pop()API。在我的其他模块中,我必须将它们链接起来,然后发生冲突。

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

4

2 回答 2

3

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

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

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

于 2013-01-18T05:01:34.537 回答
2

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

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

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

于 2013-01-18T05:07:33.840 回答