4 ms·
In practice I don't think that the latitude of making enum size depend on the enumeration has ever been used as it would be too easy to break the ABI. IIRC comp
by gpderetta 4y ago
In practice I don't think that the latitude of making enum size depend on the enumeration has ever been used as it would be too easy to break the ABI. IIRC compilers have allowed forward declaring enums as an extension before c++11 which obviously doesn't work if the size depends on the definition.
- s28l 4y agoI don't think that's true. Neither C nor C++ would allow you to invoke a function with an incomplete type, regardless of whether it is a `struct` or an `enum`, so there's no ABI issues with forward declaring them, but you wouldn't be able to define or invoke a function that takes an incomplete type argument by value. struct A; enum B; // as you pointed out, not allowed by the C++ standard // fine to declare, define, and invoke void fooA(struct A*); void fooB(enum B*); // ok to forward declare, but you can't call them void barA(struct A); void barB(enum B);
- gpderetta 4y agoWell I misremembered it seems. You can use forward declared enum class or enum : <type> in C++ as per standard: enum class A; // defaults to int enum B :int; enum C; fooA(A); FooB(B); FooC(C); fooA((A)0); fooB((B)0); fooC((C)0); // error but indeed GCC refuses plain enum. Forward declaring enums in C is an old GCC extension that still deosn't allow to pass them when incomplete; Enums in GCC do always default to int or unsigned int, unless -fshot-enums is used which is ABI breaking. Probably I was misremembering this combination of the int ABI and the forward declaring extension.