[ocaml-ctypes] Another dumb question

Jeremy Yallop yallop at gmail.com
Wed Dec 27 13:31:21 GMT 2017


On 27 December 2017 at 05:33, john skaller <skaller at internode.on.net> wrote:
> This should be a quicky….
>
> Suppose I have some messy struct in C which is generally used
> via a pointer. Eg
>
>         void f (messy_struct *, int)
>
> Instead of trying to provide field access I think I’d just like to make it
> abstract. So I would say
>
>         type messy_t
>
> and
>
>         let messy_c = ptr void
>
> and then
>
>         let f = foreign “f” = (messy_c @-> int @-> returning void)
>
> Does that seem right? (where messy_t is the Ocaml type and
> messy_c is the value encoding the view).

The usual way of dealing with this is to define a struct using
'structure' without calling 'field' or 'seal', like this:

   type messy_t
   let messy_struct : messy_t structure typ = structure "messy_struct"
   let messy_c = ptr messy_struct

   let f = foreign “f” = (messy_c @-> int @-> returning void)

Defining a structure without calling 'seal' is like writing an
incomplete type declaration in C, so the code above roughly
corresponds to

   struct messy_struct;
   typedef struct messy_struct *messy_c;

   void f(messy_c, int);

(The 'abstract' type is not often as useful as it seems to be at
first.  The use case I had in mind for it is pthread_t, which can be
different kinds of type -- struct, pointer, integer, etc. -- on
different platforms.  But that sort of thing is pretty rare in
practice.)

Kind regards,

Jeremy


More information about the Ctypes mailing list