Say, I've got the following struct:
typedef struct my_struct{ unsigned long a; unsigned long b; char* c; unsigned int d1 :1; unsigned int d2 :4; unsigned int d3 :4; unsigned int d4 :23; } my_type, *p_type; The field d3 is currently defined by #defines that reach from 0x00 until 0x0D.
Actually, d3 is an enumeration. So it's tempting to go ahead and replace
unsigned int d3 :4; by
my_enum d3 :4; Is this safe/allowed?
The code has to compile with various
Obviously, I could leave the definition of d3 as it is and use the enum in my code, assign it to d3 and so on but that's not going to work with C++.
It's allowed in all C++ compilers, that supports standard.
C++03 standard 9.6/3
A bit-field shall have integral or enumeration type (3.9.1). It is implementation-defined whether a plain (neither explicitly signed nor unsigned) char, short, int or long bit-field is signed or unsigned.
C++03 standard 9.6/4
If the value of an enu- merator is stored into a bit-field of the same enumeration type and the number of bits in the bit-field is large enough to hold all the values of that enumeration type, the original enumerator value and the value of the bit-field shall compare equal.
example
enum BOOL { f=0, t=1 }; struct A { BOOL b:1; }; void f() { A a; a.b = t; a.b == t // shall yield true } But you can't consider that enum has unsigned underlying type.
C++03 standard 7.2/5
The underlying type of an enumeration is an integral type that can represent all the enumerator values defined in the enumeration. It is implementation-defined which integral type is used as the underlying type for an enumeration except that the underlying type shall not be larger than int unless the value of an enu- merator cannot fit in an int or unsigned int
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With