понедельник, 15 июля 2019 г.

Команда cgo: ссылки C к Go

Функции Go могут быть экспортированы для использования кодом C следующим образом:

//export MyFunction
func MyFunction(arg1, arg2 int, arg3 string) int64 {...}

//export MyFunction2
func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...}

Они будут доступны в коде C как:

extern int64 MyFunction(int arg1, int arg2, GoString arg3);
extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3);

находятся в сгенерированном заголовке _cgo_export.h после копирования всех преамбул из входных файлов cgo. Функции с несколькими возвращаемыми значениями отображаются на функции, возвращающие структуру.

Не все типы Go могут быть сопоставлены с типами C полезным способом. Типы структур (struct) Go не поддерживаются; используйте тип структуры С. Типы массивов Go не поддерживаются; используйте указатель C.

Функции Go, которые принимают аргументы типа string, могут вызываться с типом C _GoString_, описанным в предыдущем посте. Тип _GoString_ будет автоматически определен в преамбуле. Обратите внимание, что в коде C нет способа создать значение этого типа; это полезно только для передачи строковых значений из Go в C и обратно в Go.

Использование //export в файле накладывает ограничение на преамбулу: поскольку он копируется в два разных выходных файла C, он не должен содержать никаких определений (definitions), только объявления (declarations). Если файл содержит определения и объявления, тогда два выходных файла будут производить дубликаты символов, и компоновщик потерпит неудачу. Чтобы избежать этого, определения должны быть помещены в преамбулы в другие файлы или в исходные файлы на языке C.


Читайте также:


Комментариев нет:

Отправить комментарий