В заголовочном файле 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.