与第三方接口 public libraries/codes
Interfacing with third-party public libraries/codes
我想评估一个算法 an available public code in my project. I have integrated the files 该算法需要进入我的项目:kodtree.h
、kodtree.cpp
、pinpolyhedron.h
和 pinpolyhedron.cpp
。然而,编译器抱怨符号不明确。我将不明确的变量名更改为其他名称,编译器编译它没有问题。这种方式看起来不像是解决问题的优雅方式。
我正在考虑使用 namespace
但发现,例如,文件 kodtree.h
有几个 extern
。
- 将它们放入
namespace
中会不会给我带来麻烦,因为它们可以包含 extern
?
- 有人可以告诉我在为此类库创建名称空间时应该注意的事项吗?
- 使用
namespace
是正确的做法吗?
- 或者为该库创建一个接口 class 并放置所有内容是否更好,即
kodtree.h
、kodtree.cpp
、pinpolyhedron.h
和 pinpolyhedron.cpp
, 在里面 class 并把它们设为私有?
- 推荐的方法是什么?
如有任何提示,我将不胜感激。
Is using namespace the right way of doing this?
是的,但不是您尝试的方式。库 应该 正确地为自己命名空间,但有时由于各种原因它们不能或不会。最好保留它们,除非您打算围绕库代码编写一个完整的包装器。
我们总是可以应用一些规则和命名空间 我们自己的 代码。简单地说,我们可以在我们自己的每一个源文件中做这样的事情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 {
}
我想评估一个算法 an available public code in my project. I have integrated the files 该算法需要进入我的项目:kodtree.h
、kodtree.cpp
、pinpolyhedron.h
和 pinpolyhedron.cpp
。然而,编译器抱怨符号不明确。我将不明确的变量名更改为其他名称,编译器编译它没有问题。这种方式看起来不像是解决问题的优雅方式。
我正在考虑使用 namespace
但发现,例如,文件 kodtree.h
有几个 extern
。
- 将它们放入
namespace
中会不会给我带来麻烦,因为它们可以包含extern
? - 有人可以告诉我在为此类库创建名称空间时应该注意的事项吗?
- 使用
namespace
是正确的做法吗? - 或者为该库创建一个接口 class 并放置所有内容是否更好,即
kodtree.h
、kodtree.cpp
、pinpolyhedron.h
和pinpolyhedron.cpp
, 在里面 class 并把它们设为私有? - 推荐的方法是什么?
如有任何提示,我将不胜感激。
Is using namespace the right way of doing this?
是的,但不是您尝试的方式。库 应该 正确地为自己命名空间,但有时由于各种原因它们不能或不会。最好保留它们,除非您打算围绕库代码编写一个完整的包装器。
我们总是可以应用一些规则和命名空间 我们自己的 代码。简单地说,我们可以在我们自己的每一个源文件中做这样的事情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 {
}