2013-09-28 5 views
0

Это наблюдение вопрос How to write void pointer typedefs in vapi files?Может ли free_function быть методом статического класса?

теперь у меня есть четыре почти одинаковые [Compact] class эс, которые представляют собой маркеры, выделенные с unixODBCs 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?

Если нет, существует ли хотя бы способ написать пользовательский файл free_function в файле vapi?

Мне нужна пользовательская функция, потому что функция SQLFreeHandle принимает тип дескриптора и дескриптор в качестве аргумента.

С точки зрения пользователей Вапи все, что действительно важно:

[CCode (cname = "void")] 
[Compact] 
public class EnvironmentHandle { 
    public static Return allocate (out EnvironmentHandle output_handle); 
} 

Единственным решением было бы использовать [SimpleType] struct как предложено apmasell в оригинальный вопрос. Это скроет тот факт, что SQLHANLDE действительно ссылочный тип.

Полный код моей текущей реализации доступна на сайте: https://github.com/antiochus/unixodbc-vala/tree/0486f54dc3f86d9c8bf31071980e4f171aca9591

ответ

1

порядка № free_function является функцией C, а не функция Вала и она не может принимать какие-либо контекст. У вас есть два варианта:

  1. Напишите макрос C в дополнительном файле заголовка, чтобы сделать то, что вы хотите, и привяжите макрос как бесплатную функцию.
  2. переплет свободной функция как статический метод, который принимает принадлежащий экземпляр объекта:

    [CCODE (CNAME = «SQLFreeHandle»)] общественности статического Возврата свободного (тип HandleType, принадлежащий EnvironmentHandle ручка);

    EnvrionmentHandle foo = ...; EnvironmentHandle.free (HandleType.ENV, (принадлежит) foo);

Смежные вопросы