Subject: Re: a new KNF (and some comments)
To: None <thorpej@nas.nasa.gov>
From: Atsushi Onoe <onoe@sm.sony.co.jp>
List: tech-kern
Date: 01/22/2000 11:17:17
> > If my memory is correct, all types except "(signed) int" and "unsigned int"
> > for bitfield are prohibited by ANSI. And you should not expect the size or
> > alignment of whole bitfields. This is why bitfield should not used in
> > protool header.
>
> If this is the case, then there is a fair bit of code in NetBSD, especially
> older device drivers, which needs to be fixed to be strict about this.
>
> In any case, GCC clearly supports it, because my Buslogic card works :-)
Since it is the restriction of ANSI C, we can go with GCC extensions.
Actually it is used for declaration of ip header in "/sys/netinet/ip.h",
and very commonly used in various *BSD, except FreeBSD, for years.
FYI, my MIPS ANSI C compiler warns:
cfe: Warning 658: bitfield2.c, line 5: bit-field 'bar' type required to be int, unsigned int, or signed int. (3.5.2.1(30))
u_int8_t bar:1,
-------- ^
cfe: Warning 658: bitfield2.c, line 6: bit-field 'baz' type required to be int, unsigned int, or signed int. (3.5.2.1(30))
baz:5,
^
cfe: Warning 658: bitfield2.c, line 7: bit-field 'zap' type required to be int, unsigned int, or signed int. (3.5.2.1(30))
zap:2;
^
Anyway the alignment of whole bitfield depends on the implementation of
compiler. For example, GCC has some configuration parameters, such as:
/* Writing `int' for a bitfield forces int alignment for the structure. */
#define PCC_BITFIELD_TYPE_MATTERS 1
The parameter itself does not affect to bitfield with "u_int8_t", but it may
cause some compatibility problems.
Atsushi Onoe