OpenCV中的一些C/C++语言细节

博客主要围绕OpenCV展开,介绍了Mat类用来表示图像,使用部分开发工具无法跳转其函数定义,需翻看源码,还说明了Mat类函数定义位置及内联函数规则。此外,讲解了函数修饰符CV_EXPORT和CV_IMPL,前者出于平台兼容性考虑,后者在.cpp文件中用extern \C\修饰函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看Mat类的定义

OpenCV中Mat用来表示图像。

使用的开发工具,Visual Studio,或者Vim+ctags,默认情况下,都没法跳转到Mat类的函数的定义,这让人抓狂。那就试着翻看源码吧。(实际上使用了LSP——也就是Language Server Protocal——的VSCode,以及Visual Studio 2017 15.8 preivew3,是可以跳转到定义的;如果VSCode给出的几个可疑定义中,你选错了,那么重启VSCode,可以再选一次)。

假定OpenCV源码目录为$OPENCV_ROOT$,则:

Mat类的定义在:

$OpenCV$/modules/core/include/opencv2/core/mat.hpp

Mat类的函数,包括各种构造函数,并没有在"mat.cpp"文件中定义。事实上根本没有"mat.cpp"文件的存在。它们定义在:

$OpenCV$/modules/core/include/opencv2/core/mat.inl.hpp

mat.inl.hpp文件名中的inl很容易想到是inline(内联)的意思,这里定义了Mat类的各种inline函数。对于内联函数,如果只有函数定义而没有函数声明,则定义时用inline修饰即可;如果既有定义也有声明,那么声明和定义都应该放在头文件中;而如果在头文件中声明inline函数、在cpp文件中定义inline函数,则链接时会报错。并且inline关键字只在函数定义时是必须的,声明时使用inline是没有用的。(参考https://blog.youkuaiyun.com/czg13548930186/article/details/76060536)。

函数修饰符CV_EXPORT

如前面所说,在Visual Studio中很多OpenCV函数找不到定义,按F12跳转到的是CVEXPORT修饰的声明。CV_EXPORT定义如下(还得是VSCode好用,轻松跳转到定义,因为用了LSP,language server protocol啊):
在这里插入图片描述

为什么vc需要dllimport/dllexport来导出类和函数,gcc不需要?

gcc不使用dllexport是因为gcc把所有函数的地址及名字(符号表)都记到目标文件中了。
而cl只记录dllexport的函数(及符号)到目标文件的export节中。

也就是说,是为了迁就cl.exe——微软家的c++编译器——OpenCV中才出现了大量的丑陋的CV_EXPORT,是出于平台兼容性考虑的。

参考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4067696

函数修饰符CV_IMPL

#ifndef CV_IMPL
#  define CV_IMPL CV_EXTERN_C
#endif
#ifndef CV_EXTERN_C
#  ifdef __cplusplus
#    define CV_EXTERN_C extern "C"
#  else
#    define CV_EXTERN_C
#  endif
#endif

也就是说,CV_IMPL的作用是:如果是.cpp文件中出现,则把一个函数用extern "C"来修饰,使得汇编得到的函数名走C的一套(而不是C++的一套)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值