declaring C enum types

Simon Marlow simonmar at microsoft.com
Thu Oct 17 05:27:57 EDT 2002


> > >     - If not, then how should enum values be declared in the FFI?
> > 
> > What you need to do is run a little autoconf-like program which
> > constructs a program containing a suitable example, runs it 
> through a
> > C compiler and tells you what's going on.
> > 
> > hsc comes very close but I'm not certain if it does exactly what you
> > need.  If not, compiling and running this program should tell you:
> 
> Hmm, careful.  The C compiler is free to be clever, and use a 
> char if there are <=256 elements in the enum, and short or 
> int otherwise.  You want to know the size of your particular 
> enum, not any random enum.

Yes.  The C99 spec says (sec. 6.7.2.1):

       [#4] Each  enumerated  type  shall  be  compatible  with  an
       integer     type.      The     choice     of     type     is
       implementation-defined   but   shall   be   capable   of
       representing  the  values  of  all  the   members   of   the
       enumeration. [...]

If a C compiler can choose any integer type, then it seems to me that
mixing code from two C compilers on the same platform might not work.
Hmmm.

Anway, I think Alastair meant to say hsc2hs (not hsc), but you do
actually get the right answer doing it this way.  In hsc2hs if you say

	(#type enum foo)

you'll get a Haskell type which corresponds to the actual type used by
the C compiler (provided hsc2hs is using the same C compiler as was used
to compile the library, presumably).

Cheers,
	Simon



More information about the FFI mailing list