C++中外部库的命名空间

Emi*_* D. 8 c++

我试图链接到一个外部库,我无法控制,它的功能没有任何名称空间.

因为我不希望与该库中定义的名称发生冲突:如何将外部头文件包含在我自己创建的命名空间中?

我知道以下代码不起作用,但问题的精神在于:

namespace extLib {
  #include "externalFolder/externalHeader.h"
}
Run Code Online (Sandbox Code Playgroud)

Max*_*hof 9

如果您正在使用仅限标头的库,则您提到的方法可能会起作用.至少我不能马上想到任何问题.

但是如果你有一个你必须链接到的编译库,就没有办法将库函数本身放入它们自己的命名空间中(至少在没有重新编译你自己的所述库版本的情况下).这是因为在.dll.so或你有什么,每个功能都有一个重整名称包括所有命名空间(例如).当你最终链接到库时,你只能在那个确切的受损名称下"到达"那些函数,这要求你的函数调用与编译版本相同(或者,在你的情况下,没有)命名空间.

"经典"解决方法是在库周围编写一个薄包装器,对于每个公开的函数,您可以:

wrapper.h:

namespace libraryWrapper
{
  void bar(int);
}
Run Code Online (Sandbox Code Playgroud)

wrapper.cpp

#include "realLibrary.h" // Defines bar(int)

void libraryWrapper::bar(int x)
{
  ::bar(x)
}
Run Code Online (Sandbox Code Playgroud)

基本的例子

  • Sans-header only 的情况,这是迄今为止我过去为此使用的最常用的方法。重要的是要注意,为了避免 *link* 时的标识符冲突,所述包装器必须在它自己的独立模块中(一个 DLL,一个 .so,选择你的毒药),只公开现在命名空间包装的函数。如果链接时间冲突是问题所在,请为此做好准备。 (2认同)