查找 MVS_API 定義
我們沒有在 List.h 文件中找到 MVS_API 的定義。MVS_API 很可能在 MVS 庫的其他地方定義。一般來說,MVS_API 是控制 OpenMVS 庫導入導出的宏,通常會出現在 MVS 的頭文件中。為了回答這個問題,我可以提供 MVS 代碼中常見的定義方式,稍后會在代碼中搜索 MVS_API。
查找 MVS_API 用法
Segmentfault 文章中提到了一些關于 MVS_API 的用法,或許可以引用它。不過,為了更準確,我認為最好直接在 OpenMVS 的代碼中搜索“MVS_API”,比如在 MVS.h 文件中查找。這樣可以更直接地得到相關信息,尤其是從 MVS 代碼庫的角度出發。
查找 MVS_API
我打算在 MVS 源代碼中搜索 "MVS_API"。通過在整個代碼庫中搜索這個關鍵詞,我們可以定位到它的定義或確切位置。這樣有助于明確 MVS_API 的功能和作用。
查找 MVS_API 定義
為了更準確地了解 MVS_API 的定義,最好在代碼中根源文件查找。它可能在 MVS_API.h 或 MVSCommon.h 中定義。為了避免遺漏,我打算在 MVS 文件夾中搜索相關內容,這樣可以直接獲得準確的定義并深入了解它的使用方式。
已思考 51 秒
下面這行代碼:
typedef MVS_API CLISTDEF0IDX(ViewScore, IIndex) ViewScoreArr;
用宏和 typedef
為 ViewScoreArr
定義了一個別名,其含義可以分解為以下幾部分:
-
MVS_API
這是一個控制符號導出/導入的宏(通常在 Windows DLL 或跨平臺庫中用來標記哪些符號需要被導出)。它本身不改變類型,只影響編譯時的鏈接屬性。 -
CLISTDEF0IDX(ViewScore, IIndex)
這是在libs/Common/List.h
里定義的宏:#define CLISTDEF0IDX(TYPE,IDXTYPE) SEACAVE::cList< TYPE, const TYPE&, 0, 16, IDXTYPE >
因此
CLISTDEF0IDX(ViewScore, IIndex)
會展開成
SEACAVE::cList<ViewScore, const ViewScore&, 0, 16, IIndex>
具體含義是:
-
SEACAVE::cList<…>
:OpenMVS 自己實現的一個動態數組模板(類似std::vector
)。 -
ViewScore
:元素類型。 -
const ViewScore&
:插入/訪問時的參數類型(ARG_TYPE
)。 -
0
:useConstruct=0
,表示在內部拷貝時不調用對象構造/析構,只做原始內存拷貝(memcpy
)。 -
16
:每次增長的最小步長。 -
IIndex
:數組下標使用的整數類型,通常是uint32_t
或size_t
。 citeturn7view0
-
-
typedef … ViewScoreArr;
最終,ViewScoreArr
就成了一個名字,代表上述那個cList
特化類型。
小結
typedef MVS_APISEACAVE::cList<ViewScore, // 存儲元素類型const ViewScore&, // 參數傳遞類型0, // useConstruct = 0,不走構造/析構16, // grow = 16,每次至少擴容16個元素IIndex // 下標類型>ViewScoreArr;
-
ViewScoreArr
:一個高效的、按需增長、用IIndex
下標存取的ViewScore
動態數組類型。 -
MVS_API
:用于控制符號導出,確保在編譯成庫時這個類型能被外部可見。
這樣在代碼里就可以直接寫:
ViewScoreArr neighbors;
neighbors.push_back(someViewScore);
而不必每次寫出冗長的模板參數。