与第三方公共图书馆/代码的接口

时间:2018-08-20 06:42:42

标签: c++ class namespaces extern

我想在项目中使用an available public code评估算法。我已将算法需要的files集成到我的项目中:kodtree.hkodtree.cpppinpolyhedron.hpinpolyhedron.cpp。但是,编译器抱怨模棱两可的符号。我将模棱两可的变量名更改为其他名称,并且编译器毫无问题地对其进行了编译。这种方法看起来不像解决问题的一种优雅方法。

我当时在考虑使用namespace,但发现例如文件kodtree.h有几个extern

  • 将它们放入namespace会给我带来麻烦,因为它们可以包含extern吗?
  • 有人可以让我知道为此类库创建名称空间时应该注意的事情吗?
  • 使用namespace是正确的方法吗?
  • 或者为该库创建一个接口类,然后将所有内容(即kodtree.hkodtree.cpppinpolyhedron.hpinpolyhedron.cpp放入该类中,还是更好)将它们设为私有?
  • 推荐的这样做方式是什么?

任何提示,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

  

使用名称空间是正确的方法吗?

是的,但不是您尝试执行此操作的方式。库本身应该正确地命名空间,但有时由于各种原因它们不能或不可以。最好保留它们,除非您打算围绕库代码编写一个完整的包装器。

我们总是可以应用一些纪律和命名空间我们自己的代码。简而言之,我们可以在我们自己的每个源文件中做这样的事情 1

#include <some_library.h>
#include <my_other_project_header.h>

namespace ProjectName { namespace ModuleName {

// Your code here

}}

这样,您的代码就可以很好地与所包含的内容隔离。除非有任何extern "C"事物,否则不应有冲突。无论库头拖动到什么位置,都不会与您在命名空间内编写的代码发生冲突。始终,您的代码可以引用最多具有一个限定级别的项目实体(Module1中的代码可以引用Module2::Foo,也可以简单地Module1::Bar引用Bar) 。除此之外,您始终可以通过完全限定事物或使用使用声明来引用Project命名空间之外的事物。


1:如果您的编译器支持C ++ 17,那么它可能更合适:

namespace ProjectName::ModuleName {

}