2012-06-05 3 views
6

mit bitfield Das ist mein bitfieldWarnung, wenn sie mit unsigned char

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

Dann bekomme ich die Warnung:

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] 

Wenn ich int ändern gibt es keine Warnung. Aber ich möchte ein Bitfeld eines Bytes (unsigned char).

Wie?

+1

'int' hat eine spezielle Bedeutung innerhalb von Bitfeldern. Was ist 'sizeof (struct valid)'? – Pubby

+0

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

+0

Dies ist eine sehr häufige Compiler-Erweiterung. Vielleicht solltest du die Warnung ignorieren, deinen Kuchen zu essen und zu essen. –

Antwort

11

Entfernen Sie die Option gcc-pedantic, wenn Sie die Warnung nicht erhalten möchten.

In C99, gcc gibt eine Warnung mit -pedantic aber es ist erlaubt eine Implementierung definiert Typen für den Bit-Bereich zu haben (wie unsigned char).

(C99, 6.7.2.1p4) "A Bit-Feld ist eine Art, die eine qualifizierte oder unqualifizierte Version des Typs _Bool ist, unterzeichnet int, unsigned int oder eine andere Implementierung definiert Art."

In C90, nur int, unsigned int und signed int sind zulässig.

(C90, 6.5.2.1) "A-Bit-Feld gibt einen Typ haben, der eine qualifizierte oder unqualifizierte Version eines int, unsigned int ist, oder signiert int"

Eigentlich sowohl in C90 und C99 Die Warnung wird von C nicht benötigt (es ist nur ein undefiniertes Verhalten in C90, aber C erfordert keine Warnung für undefiniertes Verhalten). Die Warnung wird von gcc mit -pedantic nur zur Information hinzugefügt.