2011-10-29 28 views
6

Tôi có một tệp tiêu đề khai báo một API C cho một số thư viện và tôi muốn tạo một liên kết OCaml cho lib này. Tôi thấy rằng camlidl có thể tạo sơ khai từ một tệp IDL nhưng tôi hiểu không có chuyển đổi tự động từ tệp *.h thành IDL, vì vậy bây giờ tôi tự hỏi liệu có cách nào khác để tạo ra các nhánh cho các ràng buộc OCaml từ tệp tiêu đề C không?Tạo các nút kết buộc Ocaml từ tệp tiêu đề C

Trả lời

6

Không có đủ thông tin trong tệp tiêu đề C để viết liên kết cho ngôn ngữ khác. Trong các trường hợp rất đơn giản (ví dụ, tất cả các hàm chỉ lấy số nguyên hoặc các đối số dấu chấm động), có thể, nhưng ngay khi con trỏ tham gia, bạn cần cung cấp thêm thông tin: hàm sẽ đọc từ giá trị trỏ tới, viết cho nó, hoặc cả hai? Phải giao diện cho phép một con trỏ null? Đây có phải là một con trỏ đến một mảng, và kích thước của nó ở đâu? Đây có phải là char* một con trỏ đến một chuỗi không bị chấm dứt không?

IDL mở rộng khai báo hàm C với chú thích bổ sung để bao gồm tất cả các điểm này. Đó là lý do tại sao camlidl hoạt động trên IDL và không trực tiếp trên các tiêu đề C. Bạn sẽ không tìm thấy bất cứ điều gì đáng kể ít đau đớn.

Có một cách tiếp cận khác, để tự do chú thích tiêu đề C của bạn bằng các macro có mở rộng trống nhưng cung cấp thông tin loại bổ sung, ví dụ:

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); 

Chú thích như vậy không được chuẩn hóa, vì vậy nếu bạn đi tuyến đường này, bạn sẽ phải tự viết công cụ của riêng mình. (Tra cứu Cil nếu bạn muốn phân tích cú pháp C.) Tôi khuyên bạn thay vào đó bạn xử lý các khai báo IDL là khai báo chính và tạo các tệp tiêu đề C từ chúng.

Các vấn đề liên quan