簡體   English   中英

與第三方公共圖書館/代碼的接口

[英]Interfacing with third-party public libraries/codes

我想用我的項目中可用的公共代碼評估算法。 我已經將算法所需的文件集成到我的項目中: kodtree.hkodtree.cpppinpolyhedron.hpinpolyhedron.cpp 但是,編譯器抱怨模棱兩可的符號。 我將模棱兩可的變量名更改為其他名稱,並且編譯器毫無問題地對其進行了編譯。 這種方法看起來不像解決問題的一種優雅方法。

我當時在考慮使用namespace但發現例如文件kodtree.h具有多個extern

  • 因為它們可以包含extern將它們放入namespace會不會給我帶來麻煩?
  • 有人可以讓我知道為此類庫創建名稱空間時應該注意的事情嗎?
  • 使用namespace是正確的方法嗎?
  • 還是為該庫創建一個接口類,然后將所有內容(例如, kodtree.hkodtree.cpppinpolyhedron.hpinpolyhedron.cpp )放入該類並將它們pinpolyhedron.cpp私有?
  • 建議這樣做的方法是什么?

我將不勝感激任何提示。

使用名稱空間是正確的方法嗎?

是的,但不是您嘗試執行此操作的方式。 應該適當地為其自身命名空間,但有時由於各種原因它們不能或不可以。 最好保留它們,除非您打算圍繞庫代碼編寫一個完整的包裝器。

我們總是可以施加一點紀律,並為我們自己的代碼命名空間。 簡而言之,我們可以在我們自己的每個源文件中執行以下操作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 {

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM