2012-06-05 5 views
6

Ésta es mi campo de bitsadvertencia cuando se utiliza con el campo de bits unsigned char

struct { 
    unsigned char v64 : 1; 
    unsigned char leg : 7; 
} valid; 

Entonces consigo la advertencia:

main.c:17:3: warning: type of bit-field ‘v64’ is a GCC extension [-pedantic] 
main.c:18:3: warning: type of bit-field ‘leg’ is a GCC extension [-pedantic] 

Si cambio a int no hay ninguna advertencia. Pero quiero un bitfield de un byte (char sin signo).

¿Cómo?

+1

'int' tiene un significado especial dentro de los campos de bits. ¿Qué es 'sizeof (struct valid)'? – Pubby

+0

@Pubby: using int, = 4; unsigned char = 1. – Fabricio

+0

Esta es una extensión de compilador muy común. Tal vez deberías ignorar la advertencia de tener tu pastel y comértelo. –

Respuesta

11

Elimine la opción gcc-pedantic si no desea recibir la advertencia.

En C99, gcc emite una advertencia con -pedantic pero se les permite tener una implementación del tipo definido para el campo de bits (como unsigned char).

(C99, 6.7.2.1p4) "Un campo de bits tendrá un tipo que es una versión calificado o no calificado de _Bool, firmaron int, unsigned int, o algún otro tipo definido por la implementación."

En C90, solamente int, unsigned int y signed int están permitidos.

(C90, 6.5.2.1) "Un campo de bits tendrá un tipo que es una versión calificado o no calificado de una de int, unsigned int, int o firmado"

En realidad, en tanto C90 y C99 la advertencia no es requerida por C (es un comportamiento indefinido en C90 solamente, pero C no requiere una advertencia de comportamiento indefinido). La advertencia se agrega por gcc con -pedantic solo para información.

Cuestiones relacionadas