之前文章寫完有個(gè)Flag,要寫OpenCV的解讀,后面寫了展會(huì),看書等無關(guān)緊要的文章,現(xiàn)在距離12點(diǎn)還有21分鐘,我就簡(jiǎn)短的寫一點(diǎn)分析。
首先,源碼我是從Github上面直接拉的最新的代碼,刪除一些無關(guān)緊要的文件,就變成了下面這樣。
其實(shí)在4的時(shí)代,只要導(dǎo)入這個(gè)頭文件就行,因?yàn)檫@個(gè)文件就是把所有的實(shí)現(xiàn)做了一個(gè)匯總。
里面集成了所有要使用的頭文件
里面有著條件宏來控制功能的開關(guān)與否
每次處理都需要的圖片讀取函數(shù),在這里被定義
整個(gè)文件里面有的函數(shù)和信息空間
這個(gè)函數(shù)就是判斷是不是一個(gè)圖像文件
我們注意到前面有個(gè)宏
這個(gè)是官方文檔給的函數(shù)的說明,看源碼之前一定要很熟悉官方的文檔才行
支持讀取的文件
所以這個(gè)宏是什么意思呢?
這里也插一句,我以前看騰訊的TinyOS就看到了很多這樣的函數(shù)定義,我就很疑惑,這個(gè)到底是怎么個(gè)用法?我為什么學(xué)的里面就有。
其實(shí)我理解的應(yīng)該是,這個(gè)宏首先不影響函數(shù)的功能,就是有或沒有都沒有關(guān)系,那作用是啥?
是說明!說明這個(gè)函數(shù)的一些屬性,比如它是不是一個(gè)系統(tǒng)的API,或者是需要你調(diào)用的時(shí)候自己實(shí)現(xiàn)的。我是這樣的理解,如果不對(duì)也請(qǐng)聯(lián)系我,讓我搞明白這個(gè)事情。
這里解釋一下C++里面的這個(gè)前置宏(前綴?)的大致用法。
CV_EXPORTS_W在
modules/core/include/opencv2/core/types_c.h
中定義為 的別名
CV_EXPORTS
,并且在同一文件
CV_EXPORTS
中定義為:
#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS
# define CV_EXPORTS __declspec(dllexport)
#else
# define CV_EXPORTS
#endif
換句話說,它是定義:
__declspec(dllexport)
在windows平臺(tái)上的別名CVAPI_EXPORTS,否則為空。
上面代碼里面的_delcspce(dllexport)被定義為宏,這樣可以提高程序的可讀性!這個(gè)的作是是將函數(shù)定義為導(dǎo)出函數(shù),也就是說這個(gè)函數(shù)要被包含這個(gè)函數(shù)的程序之外的程序調(diào)用!
CV_WARP 用作腳本的標(biāo)志以創(chuàng)建函數(shù)或方法的包裝器。它用于創(chuàng)建 Python 或 Java 包裝器。
應(yīng)該是多平臺(tái)之間不同的編譯器有不同的編譯選項(xiàng),只是為了以后其它平臺(tái)有需要添加的或擴(kuò)展的編譯時(shí)選項(xiàng)而預(yù)留的。例如在VC環(huán)境下進(jìn)行回調(diào)函數(shù)的聲明時(shí),很多時(shí)候都會(huì)加上**_stdcall、_cdecl、 _fastcall**這三個(gè)在windows平臺(tái)下指定函數(shù)調(diào)用的方式的編譯選項(xiàng)。所以,這種定義為空的宏的作用是預(yù)留下以后平臺(tái)移植時(shí)的其它選項(xiàng)的定義。應(yīng)該僅僅是為了移植的方便。有時(shí)候也有可能是為了對(duì)函數(shù)進(jìn)行標(biāo)識(shí),說明。
提高代碼的可移植性和平臺(tái)/編譯器無關(guān)性
宏定義必須寫在函數(shù)之外,其作用域是 #define 開始,到源程序結(jié)束。如果要提前結(jié)束它的作用域則用 #undef 命令
這樣的代碼幾乎在每個(gè)開源庫中都可能見到,主要的目的就是 C 和 C++ 混合編程,具體來說就是:
如果使用 gcc 來編譯,那么宏 __cplusplus 將不存在,其中的 extern "C" 將會(huì)被忽略;
如果使用 g++ 來編譯,那么宏 __cplusplus 就存在,其中的 extern "C" 就發(fā)生作用,編譯出來的函數(shù)名 hello 就不會(huì)被 g++ 編譯器改寫,因此就可以被 C 代碼來調(diào)用。
通過函數(shù)來實(shí)現(xiàn):
形參的類型需要確定,調(diào)用時(shí)對(duì)參數(shù)進(jìn)行檢查;
調(diào)用函數(shù)時(shí)需要額外的開銷:操作函數(shù)棧中的形參、返回值等;
通過宏來實(shí)現(xiàn):
不需要檢查參數(shù),更靈活的傳參;
直接對(duì)宏進(jìn)行代碼擴(kuò)展,執(zhí)行時(shí)不需要函數(shù)調(diào)用;
如果同一個(gè)宏在多處調(diào)用,會(huì)增加代碼體積;
時(shí)間太短只能寫這么多了~
晚安~
https://www.51cto.com/article/645044.html
https://zhuanlan.zhihu.com/p/447763456
https://pangda.blog.csdn.net/article/details/125497601
https://answers.opencv.org/question/6528/cv_wrap-and-cv_exports_w/
https://blog.csdn.net/lh1573378488/article/details/50519577
https://stackoverflow.com/questions/12083583/what-cv-exports-w-means
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4237瀏覽量
61969 -
源程序
+關(guān)注
關(guān)注
63文章
1693瀏覽量
45311 -
作用域
+關(guān)注
關(guān)注
0文章
6瀏覽量
6092
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論