Создать заглушки привязок Ocaml из файла заголовка C - PullRequest
6 голосов
/ 30 октября 2011

У меня есть заголовочный файл, который объявляет C API для некоторой библиотеки, и я хотел бы создать привязки OCaml для этой библиотеки. Я обнаружил, что camlidl может создавать заглушки из файла IDL, но, насколько я понимаю, автоматического преобразования из файла *.h в IDL не существует, поэтому теперь я задаюсь вопросом, существует ли какой-либо другой способ создания заглушек для привязок OCaml из заголовочного файла C

Ответы [ 2 ]

6 голосов
/ 30 октября 2011

В заголовочном файле C недостаточно информации для записи привязок для другого языка.В очень простых случаях (например, все функции принимают только целочисленные аргументы или аргументы с плавающей запятой), это возможно, но как только указатели будут задействованы, вам нужно предоставить больше информации: будет ли функция читать из указанного значения, записыватьк нему или к обоим?Должен ли интерфейс разрешать нулевой указатель?Это на самом деле указатель на массив, и где размер?Является ли это char* указателем на строку с нулем в конце?

IDL расширяет объявления функции C дополнительными аннотациями, чтобы охватить все эти точки.Вот почему camlidl работает на IDL, а не напрямую на заголовках C.Вы не найдете ничего значительно менее болезненным.

Существует другой подход, который заключается в свободном аннотировании заголовков C с помощью макросов, которые имеют пустое расширение, но предоставляют дополнительную информацию о типе, например

int memmove(void ANN_OUT ANN_SIZE(n) ANN_NOT_NULL *dest,
            const void ANN_IN ANN_SIZE(n) ANN_NOT_NULL *src,
            size_t n);

Такие аннотации не стандартизированы, поэтому, если вы пойдете по этому пути, вам придется написать свои собственные инструменты.(Посмотрите Cil , если вы хотите проанализировать C.) Вместо этого я рекомендую вам рассматривать объявления IDL как первичные и генерировать из них заголовочные файлы C.

0 голосов
/ 31 октября 2011

Будет ли Swig полезным?

...