防止仅标头库依赖项的命名空间冲突

Preventing namespace conflict from header-only library dependencies

提问人:daedsidog 提问时间:5/11/2023 最后编辑:daedsidog 更新时间:5/11/2023 访问量:83

问:

我正在开发一个库组件,它可以用作模板繁重的仅标头库。该库对于它导出的所有函数都有自己的命名空间。

我的问题是该库使用其他仅标头库,具有自己的命名空间。如果用户想要包含我的仅标头库,他将导入我的库的命名空间以及第三方库命名空间。这意味着,如果用户碰巧同时导入我的库和我的库的依赖项之一,则可能存在版本和/或命名空间的冲突。

为了澄清另一件事,我将某个版本的第三方库与我自己的库捆绑在一起,并且需要使用该特定版本。无法将第三方功能卸载到文件而不是标头。.cpp

我想知道处理这个问题的最佳方法是什么,或者它是否值得处理。到目前为止,我只知道两种解决方案,它们对我来说都是一种不好的做法:

  1. 在我的库命名空间下包含依赖项(往往会破坏事情)。
  2. 重命名第三方库标头中 to 的每个实例。ext_namespace::my_namespace::ext_namespace
C++ 命名空间仅 标头

评论

1赞 Alan Birtles 5/11/2023
重命名命名空间可能是唯一的选择,许多库都有一个宏来简化操作
0赞 daedsidog 5/11/2023
@AlanBirtles我明白了。这并不是说重命名它们很困难,只是我的印象是有一种更可接受的方法来解决这个问题。谢谢。
1赞 Adrian Maire 5/11/2023
如果您使用并正确使用(不添加 .我从来没有发现这是一个问题。#IFNDEFnamespaceusing namespace
1赞 ALX23z 5/11/2023
如果你使用的是模块,你可以完全隐藏对其他库的依赖。
1赞 Miles Budnek 5/11/2023
另一种选择是不捆绑第三方库,在文档中声明它是一个依赖项,然后依靠应用程序开发人员将该依赖项包含在他们的构建中。这样就不会出现多个副本或版本冲突的问题。

答: 暂无答案