我试图链接到一个我无法控制的外部库,该库的功能没有任何命名空间。
由于我不想与该库中定义的名称发生冲突:如何在我自己创建的命名空间中包含外部标头?
我知道以下代码不起作用,但是问题的实质就在这里:
namespace extLib {
#include "externalFolder/externalHeader.h"
}
答案 0 :(得分:8)
如果您正在使用仅标头库,则您提到的方法可能会起作用。至少我不能马上想到任何问题。
但是,如果您必须链接到已编译的库,则无法将库函数本身放入其自己的名称空间(至少在不重新编译您自己的版本的库的情况下)。这是因为在.dll
或.so
中,或者每个函数中,每个函数都有一个错误的名称,该名称包括所有名称空间(example)。最终链接到库时,只能以该错误的名称“访问”这些函数,这要求您的函数调用与已编译版本相同(或在您的情况下为否)命名空间。
“经典”解决方法是在库周围编写一个薄包装,对于每个公开的函数,您都可以这样做:
wrapper.h :
namespace libraryWrapper
{
void bar(int);
}
wrapper.cpp
#include "realLibrary.h" // Defines bar(int)
void libraryWrapper::bar(int x)
{
::bar(x)
}