2012-06-05 13 views
6

Questo è il mio campo di bitavvertimento quando si usa campo di bit con unsigned char

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

Allora ottengo l'avvertimento:

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] 

Se cambio a int non v'è alcun avvertimento. Ma voglio un bitfield di un byte (carattere senza segno).

Come?

+1

'int' ha un significato speciale all'interno dei campi di bit. Qual è 'sizeof (struct valid)'? – Pubby

+0

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

+0

Questa è un'estensione del compilatore molto comune. Forse dovresti ignorare l'avviso per avere la tua torta e mangiarla. –

risposta

11

Rimuovere l'opzione gcc-pedantic se non si desidera ricevere l'avviso.

In C99, gcc emette un avviso con -pedantic ma è consentito avere un tipo definito di implementazione per il campo di bit (come unsigned char).

(C99, 6.7.2.1p4) "Un po 'di campo deve avere un tipo che è una versione qualificato o non qualificato del _Bool, firmato int, unsigned int, o qualche altro tipo di implementazione definito."

In C90, solo int, unsigned int e signed int sono ammessi.

(C90, 6.5.2.1) "Un po 'di campo deve avere un tipo che è una versione qualificato o non qualificato di uno dei int, unsigned int, o int firmato"

In realtà in entrambi i C90 e C99 l'avviso non è richiesto da C (è un comportamento non definito solo in C90 ma C non richiede un avviso per comportamento non definito). L'avviso è aggiunto da gcc con -pedantic solo per informazione.

Problemi correlati