这是How to write void pointer typedefs in vapi files?
的后续问题我现在有四个几乎相同的[Compact] class
es,表示使用unixODBC SQLAllocHandle
函数分配的句柄。
第一个(对于ENV类型句柄)如下所示:
[CCode (cname = "void", free_function = "EnvironmentHandle.free")]
[Compact]
public class EnvironmentHandle {
[CCode (cname = "SQLAllocHandle")]
private static Return allocate_internal (HandleType type, void* nothing, out EnvironmentHandle output_handle);
public static Return allocate (out EnvironmentHandle output_handle) {
return allocate_internal (HandleType.ENV, null, out output_handle);
}
[CCode (cname = "SQLFreeHandle")]
private static Return free_internal (HandleType type, EnvironmentHandle handle);
public static Return free (EnvironmentHandle handle) {
return free_internal (HandleType.ENV, handle);
}
}
这不会编译。
是否可以使用静态类方法作为free_function
?
如果没有,是否至少有一种方法可以在vapi文件中编写自定义free_function
?
我需要一个自定义函数,因为SQLFreeHandle
函数将句柄类型和句柄作为参数。
从vapi用户的角度来看,所有重要的是:
[CCode (cname = "void")]
[Compact]
public class EnvironmentHandle {
public static Return allocate (out EnvironmentHandle output_handle);
}
唯一的其他解决方案是在原始问题中使用apmasell建议的[SimpleType] struct
。这将隐藏SQLHANLDE
实际上是引用类型的事实。
我当前实施的完整代码可在线获取: https://github.com/antiochus/unixodbc-vala/tree/0486f54dc3f86d9c8bf31071980e4f171aca9591
答案 0 :(得分:2)
没有。 free_function
是一个C函数,而不是Vala函数,它不能采用任何上下文。您有两种选择:
将自由函数绑定为一个静态方法,该方法获取对象的拥有实例:
[CCode(cname =“SQLFreeHandle”)] public static返回free(HandleType类型,拥有EnvironmentHandle句柄);
EnvrionmentHandle foo = ...; EnvironmentHandle.free(HandleType.ENV,(拥有)foo);