Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it safe to use an enum in a bit field?

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

  • compilers (GCC, Visual Studio, embedded stuff)
  • platforms (Win32, Linux, embedded stuff)
  • configurations (compile as C, compile as C++)

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++.

like image 424
eckes Avatar asked Aug 16 '12 08:08

eckes


1 Answers

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

like image 51
ForEveR Avatar answered Oct 11 '22 11:10

ForEveR