我在我的项目中定义了list_t
,它获得了list_pop()
之类的列表模块API。但是现在我必须使用MySQL lib与DB进行通信,但是MySQL lib仍然得到了它的列表实现,并且还定义了list_pop()
API。在我的其他模块中,我必须链接它们,并且发生冲突。
我的一个解决方案是,单独包含用于不同列表API调用的头文件,这很好用,但是有些函数需要同时调用MySQL::list_pop()
和local::list_pop()
,如何通知编译器正确的链接点?是否有一些GCC技巧可以对local::list_pop()
进行而不做任何更改?
答案 0 :(得分:3)
对于大多数实际用途,您将不得不重命名一组或另一组功能。重命名自己比MySQL更容易。
最简单的方法是简单地添加一个前缀,该前缀具有更高的独特性(足够),例如您的姓名首字母,或项目的代号,或其他内容。或者您可以重命名所有内容以避免冲突,并意识到MySQL可能会在将来添加新功能。
这就是为C ++发明命名空间的原因,以及为什么C项目通常在函数集上都有系统的前缀。
答案 1 :(得分:2)
有一种方法可以解决这个问题。将你的 list_pop()重构为my_list_pop()。
还有另外一种方法可以解决这个问题,
在这里查看MySQL my_list.h
的标题,https://github.com/lgsonic/mysql-trigger/blob/master/mysql/my_list.h你可以看到list_pop
只是一个宏,它在编译时绑定,而不是在运行时绑定(因此不是真正的图书馆功能)。将list_pop
MySQL更改为list_pop_my
(仅在#define
中)可以使其按照您的意愿执行操作。