C中的命名空间冲突

时间:2013-01-18 04:44:10

标签: mysql c list gcc compiler-construction

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

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

2 个答案:

答案 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中)可以使其按照您的意愿执行操作。