持续更新:OpenMVS中的各种问题:c++语法;代码对应的具体意义

前言:

这个文档记录的内容是OpenMVS代码里面碰到的问题,大致可以分成两类:一类是变态的c++语法,另一类是OpenMVS里面一些代码对应的具体意义。文档将会以问答的形式进行记录。

———————————————————————————————————————————————————————

c++语法问题:

1.“ASSERT(imagesMap[idx] != NO_ID)”似乎是一个判断语句,背后具体是怎么封装起来的?
解:
点击进去发现:

#define ASSERT(exp)	assert(exp)

原来是宏定义的assert()函数,这个assert()函数是什么呢?
assert宏的原型定义在<assert.h>中,如果给定到它的条件返回错误,则终止程序。
那么对应到OpenMVS里面的意思就是,当图像ID是NO_ID时,说明前面的步骤中发生了错误,终止程序。

2.点进NO_ID的宏定义是“DECLARE_NO_INDEX(uint32_t)”,这背后又是些什么骚操作?
解:
与NO_ID对应的代码为:

#define DECLARE_NO_INDEX(...) std::numeric_limits<__VA_ARGS__>::max()  
#define NO_ID DECLARE_NO_INDEX(uint32_t) 

首先,(…)是一个可变参数。后面的__VA_ARGS__是一个编译器预定义宏,它实际上表示了前面的可变参数(…)。
因此NO_ID的实际的宏定义代码是 std::numeric_limits<uint32_t>::max()
那么这个据代码返回的又是什么呢?
举个例子:

std::cout << std::numeric_limits<uint16_t>::max () << std::endl;

输出:65535(注:65535=2^16)

参考博文:
可以跑一跑这里面关于__VA_ARGS__的例子:
https://www.cnblogs.com/alexshi/archive/2012/03/09/2388453.html
https://blog.csdn.net/boyemachao/article/details/109257915
这里有关于numeric_limits的作用:
https://zhidao.baidu.com/question/2058213989254607347.html

3.OpenMVS里面的for循环被封装成了FOREACH,看着挺便捷的,实际上内部是怎样的?
查看FOREACH具体的定义:

#define ARR2IDX(arr) typename std::remove_reference<decltype(arr)>::type::size_type
#else
<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值