OpenCV4源码分析-宏定义

2022-11-29 15:44:42 浏览数 (1)

之前文章写完有个Flag,要写OpenCV的解读,后面写了展会,看书等无关紧要的文章,现在距离12点还有21分钟,我就简短的写一点分析。

首先,源码我是从Github上面直接拉的最新的代码,删除一些无关紧要的文件,就变成了下面这样。

其实在4的时代,只要导入这个头文件就行,因为这个文件就是把所有的实现做了一个汇总。

里面集成了所有要使用的头文件

里面有着条件宏来控制功能的开关与否

每次处理都需要的图片读取函数,在这里被定义

整个文件里面有的函数和信息空间

这个函数就是判断是不是一个图像文件

我们注意到前面有个宏

这个是官方文档给的函数的说明,看源码之前一定要很熟悉官方的文档才行

支持读取的文件

所以这个宏是什么意思呢?

这里也插一句,我以前看腾讯的TinyOS就看到了很多这样的函数定义,我就很疑惑,这个到底是怎么个用法?我为什么学的里面就有。

其实我理解的应该是,这个宏首先不影响函数的功能,就是有或没有都没有关系,那作用是啥?

是说明!说明这个函数的一些属性,比如它是不是一个系统的API,或者是需要你调用的时候自己实现的。我是这样的理解,如果不对也请联系我,让我搞明白这个事情。

这里解释一下C 里面的这个前置宏(前缀?)的大致用法。

CV_EXPORTS_W在

代码语言:javascript复制
modules/core/include/opencv2/core/types_c.h

中定义为 的别名

代码语言:javascript复制
CV_EXPORTS

,并且在同一文件

代码语言:javascript复制
CV_EXPORTS

中定义为:

代码语言:javascript复制
#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS
# define CV_EXPORTS __declspec(dllexport)
#else
# define CV_EXPORTS
#endif

换句话说,它是定义:

代码语言:javascript复制
__declspec(dllexport)

在windows平台上的别名CVAPI_EXPORTS,否则为空。

上面代码里面的_delcspce(dllexport)被定义为宏,这样可以提高程序的可读性!这个的作是是将函数定义为导出函数,也就是说这个函数要被包含这个函数的程序之外的程序调用!

CV_WARP 用作脚本的标志以创建函数或方法的包装器。它用于创建 Python 或 Java 包装器。

应该是多平台之间不同的编译器有不同的编译选项,只是为了以后其它平台有需要添加的或扩展的编译时选项而预留的。例如在VC环境下进行回调函数的声明时,很多时候都会加上_stdcall、_cdecl、 _fastcall这三个在windows平台下指定函数调用的方式的编译选项。所以,这种定义为空的宏的作用是预留下以后平台移植时的其它选项的定义。应该仅仅是为了移植的方便。有时候也有可能是为了对函数进行标识,说明。

提高代码的可移植性和平台/编译器无关性

宏定义必须写在函数之外,其作用域是 #define 开始,到源程序结束。如果要提前结束它的作用域则用 #undef 命令

这样的代码几乎在每个开源库中都可能见到,主要的目的就是 C 和 C 混合编程,具体来说就是:

如果使用 gcc 来编译,那么宏 __cplusplus 将不存在,其中的 extern "C" 将会被忽略;

如果使用 g 来编译,那么宏 __cplusplus 就存在,其中的 extern "C" 就发生作用,编译出来的函数名 hello 就不会被 g 编译器改写,因此就可以被 C 代码来调用。

通过函数来实现:

形参的类型需要确定,调用时对参数进行检查;

调用函数时需要额外的开销:操作函数栈中的形参、返回值等;

通过宏来实现:

不需要检查参数,更灵活的传参;

直接对宏进行代码扩展,执行时不需要函数调用;

如果同一个宏在多处调用,会增加代码体积;

时间太短只能写这么多了~

晚安~

代码语言:javascript复制
https://www.51cto.com/article/645044.html
代码语言:javascript复制
https://zhuanlan.zhihu.com/p/447763456
代码语言:javascript复制
https://pangda.blog.csdn.net/article/details/125497601
代码语言:javascript复制
https://answers.opencv.org/question/6528/cv_wrap-and-cv_exports_w/
代码语言:javascript复制
https://blog.csdn.net/lh1573378488/article/details/50519577
代码语言:javascript复制
https://stackoverflow.com/questions/12083583/what-cv-exports-w-means

0 人点赞