extern(C) enum

jmh530 via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Sep 15 19:04:56 UTC 2017


On Friday, 15 September 2017 at 18:20:06 UTC, Jonathan M Davis 
wrote:
>
> It is my understanding that for both C and C++, an enum is 
> always an int (unless you're talking about enum classes in 
> C++). The size of an int can change based on your architecture, 
> but AFAIK, all of the architectures supported by D guarantee it 
> it be 32 bits in C/C++ (certainly, all of the architectures 
> supported by dmd do), and druntime would have serious issues if 
> it were otherwise, as it assumes all of the place that D's int 
> is the same as C/C++'s int.
>
> It's certainly possible that my understanding of C/C++ enums is 
> wrong, but if it is, you'd basically be screwed when dealing 
> with any C functions that take an enum in any case that an enum 
> wasn't 32 bits - especially if the C/C++ compiler could choose 
> whatever size it wanted that fit the values.
>
> - Jonathan M Davis

Not to hijack the thread, but is there anything about enums that 
can't be done with a struct? The code below is just a simple 
example that I'm sure I could complicate unnecessarily to 
re-create much of the behavior of current enums with the syntax 
of std.tuple.

I suppose what I'm wondering how E.B below is treated in the 
writeln. With an enum, it would be a manifest constant. Does 
static initialization of the struct do the same thing?

struct Enum(T)
{
     T A;
     T B;
}

static Enum!int E = {A:0, B:1};

void main()
{
     import std.stdio : writeln;

     writeln(E.B);
}


More information about the Digitalmars-d-learn mailing list