【问题标题】:Interfacing with third-party public libraries/codes与第三方公共库/代码的接口
【发布时间】:2019-01-26 06:17:43
【问题描述】:

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

我正在考虑使用namespace,但发现例如文件kodtree.h 有几个externs。

  • 将它们放入namespaces 是否会给我带来麻烦,因为它们可以包含extern
  • 谁能告诉我在为此类库创建命名空间时应该注意的事项?
  • 使用namespace 是正确的做法吗?
  • 或者最好为这个库创建一个接口类并将所有内容(即kodtree.hkodtree.cpppinpolyhedron.hpinpolyhedron.cpp)放在该类中并将它们设为私有?
  • 推荐的方法是什么?

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

【问题讨论】:

  • 什么是模棱两可的符号?实际上,只有在您过度使用 using 或者您有更多代码在全局命名空间中声明内容时才会发生这种情况
  • @user463035818 我删除了using并将typedef double Box中的符号Box更改为BOX

标签: c++ class namespaces extern


【解决方案1】:

使用命名空间是正确的做法吗?

是的,但不是您尝试的方式。库应该为自己正确命名,但有时由于各种原因它们不能或不会。最好不要使用它们,除非您打算为库代码编写一个完整的包装器。

我们总是可以应用一些规则和命名空间我们自己的代码。简单地说,我们可以在我们自己的每一个源文件中做这样的事情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)。除此之外,您始终可以通过完全限定事物或使用 using 声明来引用 Project 命名空间之外的事物。


1:如果你的编译器支持C++17,那就更好吃了:

namespace ProjectName::ModuleName {

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多