LINUX.ORG.RU

Использование функций и переменных из C в Vala.

 ,


0

1

Как в Vala использовать функцию на C? Знаю, что можно воспользоваться словом extern, но есть ещё вопросы.

У меня есть функция, которая принимает 2 параметра: gchar* и GHashTable*. В первом лежит имя файла, а по второй ссылке GHashTable в который эта функция кладёт всякие штуки. В Vala указателей нет, есть ссылки (reference). Как мне имея строку с именем файла и объект HashTable передать их в extern функцию?

А ещё, как это всё собирать/канпелять? С какими опциями запускать valac если в файле есть внешние функции из C?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Как в Vala использовать функцию на C?

Функции на C наверное лучше выделять в отдельную билиотеку с vapi-файлом, чтобы «груши отдельно, яблоки отдельно».

Но если принципиально extern, то как-нибудь так

// c_code.c
#include <glib.h>

void c_func (gchar      *str,
             GHashTable *htable)
{
  g_printf ("Do something with str and htable...");
}
// vala_code.vala
/* Если C-ишная функция допускает передачу нулевых указателей, то ставится знак вопроса.
 * Если нужно, чтобы компилятор Vala делал проверку, то '?' опускается.
 */
extern void c_func (string? str, HashTable<string, string> hash_func);

void main () {
  stdout.printf ("Hello world!\n");

  var hash_func = new HashTable<string, string> (str_hash, str_equal);
  c_func ("abc", hash_func);
}
#!/bin/sh

cc -c `pkg-config --cflags glib-2.0` c_code.c -o c_code.o
valac -c vala_code.vala
cc *.o -o app `pkg-config --libs glib-2.0 gobject-2.0`
Если проект не только для себя, то можно использовать, к примеру, CMake с модулем Vala_CMake.

По контролю памяти там есть шпаргалка (Vala/ReferenceHandling).

backbone ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.