Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中外部库的命名空间+;_C++ - Fatal编程技术网

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

C++ C+中外部库的命名空间+;,c++,C++,我正在尝试链接到一个外部库,在这个库上我没有控制权,它的函数没有任何名称空间 因为我不想与该库中定义的名称发生冲突:如何在我自己创建的名称空间中包含外部头 我知道以下代码不起作用,但问题的实质是: namespace extLib { #include "externalFolder/externalHeader.h" } 如果您使用的是仅标题库,那么您提到的方法可能会起作用。至少我现在想不出任何问题 但是,如果您有一个必须链接的已编译库,则无法将库函数本身放入它们自己的名称空间(至少在不

我正在尝试链接到一个外部库,在这个库上我没有控制权,它的函数没有任何名称空间

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

我知道以下代码不起作用,但问题的实质是:

namespace extLib {
  #include "externalFolder/externalHeader.h"
}

如果您使用的是仅标题库,那么您提到的方法可能会起作用。至少我现在想不出任何问题

但是,如果您有一个必须链接的已编译库,则无法将库函数本身放入它们自己的名称空间(至少在不重新编译所述库的您自己版本的情况下是这样)。这是因为在
.dll
中,每个函数都有一个损坏的名称,其中包括所有名称空间()。当您最终链接到库时,您只能“访问”该确切名称下的那些函数,这要求您的函数调用与编译版本的命名空间相同(或者,在您的情况下,没有命名空间)

“经典”解决方案是围绕库编写一个薄包装,其中对于每个公开的函数,您可以:

包装器.h

namespace libraryWrapper
{
  void bar(int);
}
包装器.cpp

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

void libraryWrapper::bar(int x)
{
  ::bar(x)
}

什么是“不工作”?@SombreroChicken如果它不是一个只包含头的库,将头包含到错误的名称空间中,将向链接器“承诺”在该名称空间中存在某些它在那里找不到的符号。想想损坏的名称。它不应该工作,因为该库不会从您将其头包含到的任何名称空间导出名称。@WhozCraig我不喜欢从我身上拿走任意标识符(或者更糟的是,出现故障)。名称空间的存在是有原因的,如果不想将代码隔离到适当的名称空间中,不应该满足“只是不产生任何冲突”——那么我们就不需要名称空间了。针对library.Sans-header-only情况提交严重缺陷报告,这是我过去用过的最常用的方法。重要的是要注意,为了避免链接时的标识符冲突,所述包装器必须位于其自己的隔离模块中(一个DLL,一个.so,选择您的毒药),只公开现在名称空间包装的函数。如果链接时间冲突是问题所在,请对此做好准备。另一种可能的解决方案(但仅适用于c库)如下所述:@WhozCraig有意义。我想您可以通过在名称空间中拥有自己的代码(如果需要匿名代码)来避免这种需要,尽管我不知道您不能这样做是否有原因。好吧,我想如果你有两个这样讨厌的无命名空间库,它们可能会冲突*发抖*@MaxLanghof-Heh,当然。如果无法为第三方代码命名名称空间,请为其他所有代码命名名称空间。是的,那会管用的,但是天哪。关于匿名名称空间,对于每个模块的静态内容,不使用它们是愚蠢的。我无法公正地描述我从多年的技术债务中清除了多少全局名称空间的污染,而只是将不必要的全局实践放在我工作时继承的代码中。即使被告知不要这样做,他们仍然这样做。几乎跟不上了。无论如何,回答得好。它甚至不适用于任何包含标准库头的仅头库。