free_function可以是静态类方法吗?

时间:2013-09-28 21:32:31

标签: vala vapi

这是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

1 个答案:

答案 0 :(得分:2)

没有。 free_function是一个C函数,而不是Vala函数,它不能采用任何上下文。您有两种选择:

  1. 在额外的头文件中写一个C宏来做你想做的事情并将宏绑定为自由函数。
  2. 将自由函数绑定为一个静态方法,该方法获取对象的拥有实例:

    [CCode(cname =“SQLFreeHandle”)] public static返回free(HandleType类型,拥有EnvironmentHandle句柄);

    EnvrionmentHandle foo = ...; EnvironmentHandle.free(HandleType.ENV,(拥有)foo);