RFC 7:对VSI*L函数使用VSILFILE
作者:甚至鲁奥(埃里克多恩格斯是原作者)
联系人:even dot rouault,邮箱:spatialys.com,Eric.Doenges@gmx.net
状态:通过
目的
将VSI*L函数族的API更改为使用新的数据类型VSI L FILE而不是当前文件。
背景、理由
目前,GDAL提供了两个api来抽象文件访问函数(称为VSI * 和VSI我在这份文件中)。两个api都声称对文件指针进行操作;但是,VSI L函数只能对VSIFOpenL函数创建的文件指针进行操作。这是因为VsifOpenl返回指向一个内部C++类类型的指针,而不是一个实际的文件指针。这使得编译器无法在VSI * 和VSI*L函数混合不恰当。
建议的修复
应声明新的不透明数据类型VSILFILE。所有VSIL函数应更改为使用这种新类型而不是文件。另外,任何使用VSI的GDAL代码 L函数也必须更改才能使用此数据类型。
RawRasterBand变化
两个构造函数被更改为接受一个void * fpRaw而不是文件 *
新成员VSILFILE * 添加了fpRawL。现有成员文件 * 保留fpRaw。构造函数将根据bIsVSIL参数的值设置足够的成员。
一种新方法VSILFILE * 已添加GetFPL()。
旧文件 * GetFP()被调整为具有与以前相同的行为(可以返回标准文件句柄或VSI*L句柄,具体取决于传递给构造函数的句柄)
这些改变是为了在使用RawRasterBand时最小化对casting的需求。保留向后API兼容性。
兼容性问题,转换时间线
为了允许编译器检测传递给任何VSI*L函数的不适当的参数,VSILFILE将通过一个空的forward声明来声明,即。
typedef struct _VSILFILE VSILFILE
结构VSILFILE本身未定义。
但是,这将破坏使用VSI*L API的任何现有代码的源代码兼容性。因此,目前,VSIL FILE被定义为FILE的别名,除非定义了VSIL_STRICT_ENFORCE宏。
#ifdef VSIL_STRICT_ENFORCE
typedef struct _VSILFILE VSILFILE;
#else
typedef FILE VSILFILE;
#endif
未来版本(GDA 2.0?),将更改行为以强制新的强类型。
在处理VSIF*lapi时,自采用此RFC以来所做的任何未来开发都应该使用VSILFILE。
问题
在定义调试时,是否应该默认定义VSIL_STRICT_ENFORCE?
这将使GDAL开发人员更容易使用适当的类型,但在使用发布模式时不会影响API/ABI。
实施
整个源树(port、gcore、frmts、ogr、swig/include)将被适当地修改,以便在VSIL_STRICT_ENFORCE模式下编译。Ticket#3799包含实现的修补程序。编译没有添加任何新的警告。更改后自动测试套件仍然有效。
GeoRaster和JPIPKAK驱动程序在转换过程中已被修改,但我无法编译它们。感谢测试。在转换过程中更改的所有其他驱动程序都已编译。
在转换过程中,在ceos2驱动程序中发现了POSIX文件API与大型文件处理程序的误用,但函数碰巧未被使用。
投票历史
* Frank Warmerdam +1
* Tamas Szekeres +1
* Daniel Morissette +1
* Howard Butler +1
* Even Rouault +1