今天在移植和优化算法程序时遇到一个问题,这个问题可能老手工程师会经常见,我却在这里犯迷糊了,
话不多说先上代码看看问题是啥
typedef void *GDALDatasetH;
GDALDatasetH baseImgDS = GDALOpenShared(baseImgPath,GA_ReadOnly);
GDALDatasetH regImgDS = GDALOpenShared(regImgPath, GA_ReadOnly);
GDALDatasetH *baseds = baseImgDS;
GDALDatasetH *regds = regImgDS;
先来说明一下typedef void *GDALDatasetH;的问题,
这个的含义其实是说明用GDALDatasetH来代表void*,
也可以理解为GDALDatasetH = void*;
大家都知道,使用void*类型指针前必须先转换成某种确定的类型,如
void *test;
int *a = static_cast<int*>test;//显示转换成int*
void类型指针可以作为函数的参数或者返回值
1:作为参数,一般不关心传递进来的地址类型,比如memset这个函数的原型,memset就是为了将传递进来的地址开始的n个字节的值全部赋值成某个特定的值,所以没必要知道是什么类型的指针,就用void类型指针代替了。
2:作为返回值:一般是返回一个地址,至于这个地址你要做什么用那是你决定的,最常见的就是malloc了,它返回void类型指针作为分配好的内存区的首地址,至于是什么类型,就需要用户自己来指定了。
再来看看我们的问题
之前没遇到过这个问题的同学刚开始看到这个绝对会迷糊,这到底是怎么回事?
我们不妨直接把GDALDatasetH 换成void* 来带回到问题中去一下子就理解了
void* baseImgDS = GDALOpenShared(baseImgPath,GA_ReadOnly);
GDALDatasetH regImgDS = GDALOpenShared(regImgPath, GA_ReadOnly);
void* baseds = baseImgDS;
void* regds = regImgDS;
这样结合我上面说的关于void*的使用说明,一下子就理解了,其实baseImgDS本来就是一个void*类型的指针,
在声明baseds时,使用void*类型指针,这里又把它转换为void*类型了,这样做看起来是没有意义的,但是只是为了
迎合下面的一个函数的输入,这个函数的输入类型要求是
struct baseRegistrationReturn baseRegistration(GDALDatasetH* baseImgDS, const char * baseImgRpcPath, int baseOX, int baseOY,
GDALDatasetH* resImgDS, const char * regImgRpcPath, int regOX, int regOY)
看到了吗?输入类型就是GDALDatasetH *,所以这个地方只是为了转换为输入参数的类型而已,如果不是
函数输入要求,这种做法是没有任何意义的。