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

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

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

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

    最佳答案



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

    我们总是可以施加一点纪律,并为我们自己的代码命名空间。简而言之,我们可以在我们自己的每个源文件中执行以下操作:

    #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 {
    
    }
    

    关于c++ - 与第三方公共(public)图书馆/代码的接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51925305/

    10-11 22:41
    查看更多