tengo el siguiente código.
typedef enum {FOO, BAR} Baz; int main() { Baz f1 = FOO; typeof(FOO) f2 = FOO; return (f1 == f2); } Mi compilación usando gcc -Wextra foo.c genera una advertencia que dice
foo.c: In function 'main': foo.c:7:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] return (f1 == f2); ^Mi versión de gcc
gcc --version gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2¿Como puedo solucionar este problema?
Citando directamente de C11 , capítulo §6.7.2.2 , Especificadores de enumeración ,
Cada tipo enumerado debe ser compatible con
char, un tipo de entero con signo o un tipo de entero sin signo. La elección del tipo está definida por la implementación.
Por lo tanto, el tipo de variable de enumeración no está definido por estándar. Puede ser cualquiera de los anteriores.
OTOH, FOO es una constante de enumeración, typeof(FOO) le dará int , como exige el estándar
Un identificador declarado como una constante de enumeración tiene tipo
int.
que se utiliza como tipo para f2 .
Ahora, si enum no está unsigned int en su implementación, también lo está f1 y f2 es int .
A continuación, recibe la advertencia.
¿Como puedo solucionar este problema?
Bueno, si cambia el tipo de f2 a typeof(Baz) , que da el tipo de enumeración, entonces ambos tipos de f1 y f2 serán iguales. El compilador estará feliz.