前言:
这个文档记录的内容是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
#