2012-06-05 23 views
6

To mój bitfieldostrzeżenie przy korzystaniu z bitfield unsigned char

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

Następnie pojawia się ostrzeżenie:

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] 

Jeśli zmieni się int nie ma ostrzeżenia. Ale chcę bitfield bajt (unsigned char).

Jak?

+1

'int' ma specjalne znaczenie wewnątrz pól bitowych. Co to jest "sizeof (struct valid)"? – Pubby

+0

@Pubby: używając int, = 4; unsigned char = 1. – Fabricio

+0

Jest to bardzo częste rozszerzenie kompilatora. Może powinieneś zignorować ostrzeżenie, by zjeść swoje ciasto i je zjeść. –

Odpowiedz

11

Usuń opcję gcc-pedantic, jeśli nie chcesz otrzymywać ostrzeżenia.

W C99, gcc wydaje ostrzeżenie z -pedantic, ale dozwolone jest zdefiniowanie implementacji dla pola bitowego (np. unsigned char).

(C99, 6.7.2.1p4) "A bit pola mają typ, który jest wykwalifikowany lub niewykwalifikowany wersja _Bool podpisanego int, unsigned int, lub innego typu implementacji zdefiniowane".

W C90, tylko int, unsigned int i signed int są dozwolone.

(C90, 6.5.2.1) "A bit pola mają typ, który jest wykwalifikowany lub niewykwalifikowany wersja jednego z int, unsigned int, lub podpisane int"

Właściwie w obu C90 i C99 ostrzeżenie nie jest wymagane przez C (jest to niezdefiniowane zachowanie tylko w C90, ale C nie wymaga ostrzeżenia o niezdefiniowanym zachowaniu). Ostrzeżenie jest dodawane przez gcc z -pedantic wyłącznie w celach informacyjnych.

Powiązane problemy