declaring C enum types
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. 22.214.171.124):
[#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
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.
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).
More information about the FFI