Estoy tratando de usar enumeración en C para crear una variable de banderas, como se explica aquí: Banderas, enumeración (C)
Problema:
Digamos que declaro mi tipo de banderas así:
typedef enum { FLAGS_A = 1 << 0, FLAGS_B = 1 << 1, FLAGS_C = 1 << 2, FLAGS_D = 1 << 3 } flags_t; flags_t flags;Me gustaría restablecer una bandera como esta:
flags |= FLAGS_A; // Set A flags &= (~FLAGS_A); // Reset ASin embargo, el compilador (Microchip XC8 Compiler V2.32) arroja un error porque los operadores bit a bit solo deben usarse en tipos sin firmar. Parece que la enumeración es en realidad un entero con signo debajo del capó.
Basado en esta pregunta, parece que no hay una buena manera de obligar al compilador a usar sin firmar para la enumeración: ¿Hay alguna manera de hacer que una enumeración no esté firmada en el estándar C90? (Cumple con MISRA-C 2004)
Cosas que he probado:
Una solución que encontré fue agregar una variable enumerada especial que tiene todos los demás indicadores establecidos. Puedo usar eso como una máscara para restablecer la bandera A:
typedef enum { .... FLAGS_RESET_A = (FLAGS_B | FLAGS_C | FLAGS_D) } flags_t flag_t flags &= (FLAGS_RESET_A); // Reset AEsta solución es engorrosa. Cada vez que modifico el tipo de banderas, como agregar una bandera, también tengo que recordar modificar todas las máscaras de reinicio. Espero que haya un método que conserve la enumeración como una "fuente única de verdad" para las definiciones de bandera.
Otra solución es la conversión de tipo a un entero sin signo, pero eso anula la seguridad de usar un tipo enumerado.