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的问题
所以,我还是更喜欢用对象来操作