gnuc - ¿Es posible especificar el ancho de bits de una enumeración en C++ 11?
gcc ultima version (3)
El código que usted publicó debe ser aceptado por los compiladores más recientes. Puede ver este informe de errores donde debería haberse producido la corrección: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51242
En el gcc de hoy, todavía se debe emitir una advertencia. En clang, no deberías ver nada.
Estoy intercambiando paquetes con un dispositivo integrado y realmente me gustaría poder usar enumeraciones en las partes de sub-bytes de las definiciones de paquetes también. Pero no puedo adivinar una sintaxis que funcione y sospecho que no es posible, ya que no puedo averiguar cómo declarar un subtipo de byte parcial en C ++:
enum class communication_path_t : uint8_t {
Ethernet = 0, Wifi = 1
};
typedef struct {
communication_path_t pathByte; // works, uses one byte
// ...
// single byte split three ways
uint8_t retryCount : 3;
communication_path_t path : 3; // compile error
uint8_t deviceType : 2;
} packet_t;
Eso no se compila, porque no se puede colocar una enumeración de 8 bits en un campo de 3 bits. Editado en el error exacto:
<anonymous struct>::path’ is too small to hold all values
of ‘enum class MyNamespace::communication_path_t’ [-Werror]
Lo que me gustaría hacer es algo como esto:
enum class communication_path_t : uint8_t : 3 { ...
o
typedef uint8_t:3 three_bit_int_t;
enum class communication_path_t : three_bit_int_t { ...
Ninguno de esos compiladores, y tengo problemas para encontrar documentación que se refiera tanto a los campos de bits como a las enumeraciones, lo que me hace sospechar que no hay ninguno. Antes de pasar horas buscando, ¿es posible lo que estoy tratando de hacer?
Edición: actualizar a g ++ - 4.9 no soluciona el problema. Es notablemente indoloro, solo:
sudo apt-get install g++-4.9
g++-4.9 --version
g++-4.9 (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
GCC 4.9.2 released [2014-10-30]
Luego, cambie mi cadena de compilación para usar "g ++ - 4.9" en lugar de "g ++". Lamentablemente me sale el mismo error:
g++-4.9 -Dlinux -std=c++11 -pthread (...) ../common/LogPacketBreakdown.cpp
In file included from ../common/LogPacketBreakdown.cpp:12:0:
../common/PacketInfo.h:104:50: error: ‘Digiflex::<anonymous
struct>::communicationPath’ is too small to hold all values of
‘enum class Digiflex::communication_path_t’ [-Werror]
communication_path_t communicationPath : 3;
Parece que necesito 5.0 y eso no está en la lista de herramientas experimentales de Ubuntu, así que necesitaría compilar desde la fuente. Creo que voy a vivir con la solución por ahora. Gracias a todos por su ayuda.
Funciona al menos desde g ++ 4.8 en debian, así que asumo también en ubuntu.
El compilador solo da una advertencia, el error en este caso fue incluido por la opción del compilador- Herror . Es una buena idea configurar -Werror para el desbordamiento ya que esto se informará cuando se asigne un valor de enumeración que no se ajuste a un campo de bits.
No, no hay forma de typedef
un campo de bits en C ++, ni siquiera con un tipo de enumeración.
Bitfield-ness es una propiedad de las declaraciones de variables miembro, no es compatible con el sistema de tipos en absoluto.
Pero, tu primer ejemplo está perfectamente bien. Como dice Bill, es un error de GCC, y como note desarrolladores de GCC, es solo una advertencia desde 2013. La solución es usar int path : 3;
y para convertir los valores de enumeración, o no utilice una enum
en absoluto.