GDAL C++中GDALDatasetH 使用分析

GDALDatasetH

首先我们先了解一下什么是GDALDatasetH

GDALDriverH是GDAL Driver的句柄,是一个指向GDALDriver结构体的指针

句柄(Handle)是一种引用对象的方法,相当于一个代理或代号来指代一个对象,以便于在程序之间传递引用。句柄通常是一个整数值,可以是指向实际对象的指针。

句柄的使用可以隐藏指针的操作细节,防止非法操作并提高系统安全性,例如通过指针操作句柄可以避免指针越界和空指针引用等问题。同时,使用句柄可以避免对象复制和移动的问题

开头

在GDAL的C++接口中,GDALDriver的公共静态函数ToHandle与FromHandle让我联想到了上一个C++中引用C函数的问

因为在 GDAL C++ API 中,使用 GDALDriver 对象操作数据集是首选的方式,不需要使用 GDALDriverH 句柄。GDALDriver 对象是驱动程序的封装,通过 GDALDriver 对象可以访问驱动程序的方法和属性,比使用 GDALDriverH 句柄更加简单和安全。

但是若在C ++程序中使用C库函数(如GDAL的C函数),则需要使用GDALdriverh的强制类型转换语句来确保程序正确。这是因为C和C ++之间的类型规则不同,C允许的隐式类型转换,在C++中可能会导致错误或者警告

代码

    const char *pszDriverName = "GTIFF"; // GTiff驱动程序名称

    GDALDriver *poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName); // 获取驱动程序
   
    GDALDatasetH dataseth = GDALCreate(poDriver, “test1.tif” , 512, 512, 1, GDT_Byte, NULL);

结果

正常运行

代码中没有强制将"poDriver"转换为GDALDriverH类型的句柄,但任然正常运行可能是由于"GDALCreate"函数的实现定义中进行了GDALDriver类型到GDALDriverH类型的隐式类型转换

在某些编译器中,它们允许将指向结构体的指针隐式转换为指向结构体的句柄,这也可能是为什么代码可以运行而未发生任何问题的原因之一。

但由于不同的编译器实现和不同的操作系统处理句柄的方式可能存在差异,因此为了代码的可移植性和正确性,以及严谨性和规范性考虑,建议使用强制类型转换(GDALDriverH)poDriver以确保代码正确运行,这也是一个良好的编程习惯

结论

在 GDAL C++ API 中,使用 GDALDriver 对象操作数据集是首选的方式,不需要使用 GDALDriverH 句柄

但在某些情况下,可能需要将 GDALDriver 对象转换为 GDALDriverH 句柄,然后使用 C API 与其他库进行交互。例如,在 C 语言代码中使用 GDAL API,或与某些 C 库进行交互时,需要将 GDALDriver 对象转换为 GDALDriverH 句柄

GDALDriver* poDriver = ...
GDALDriverH hDriver = (GDALDriverH)poDriver;

原因

GDALDriver 对象是驱动程序的封装,通过 GDALDriver 对象可以访问驱动程序的方法和属性,比使用 GDALDriverH 句柄更加简单和安全,不用考虑强制转换GDALDriverH的问题

所以,我还是更喜欢用对象来操作

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

场主不吃鍋巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值