enum, bit fields, cpp...
turner at ucbesvax.UUCP
turner at ucbesvax.UUCP
Fri Mar 9 16:41:00 AEST 1984
/* C hackers: why does this abort? (Don't peek at the answer below.) */
typedef enum {False, True} bool;
main() { /* note the single-bit-field below */
struct { bool flag : 1; } var;
var.flag = True;
if (var.flag != True ) abort ( );
}
/* * * * * * * * * */
Give up? Well, except for type-checking, enum bools "are treated as if
they were int" [1] in the Ritchie C compiler; this is the only guideline
on the question of enum signedness. The single-bit field may or may not
be considered signed [2]. If it is signed, the flag bit is read out and
sign-extended. For 4.2 BSD pcc, var.flag == (bool) (-1). Now try
if ( (var.flag = True) != True) abort ( );
With 4.2 pcc, this doesn't abort--I suppose because the compiler is "smart"
about assigning constants and then comparing results within a certain window.
If you are a crypto-Wirthite strong-typing warrior in the Jihad against
Dangerous and Sacrilegious Programming Styles (like me), I highly recommend
using one of the following forms for Boolean typedefs:
/* * * * * * * * * */
#if pdp11 || ... /* ... any machine with unsigned bit-fields */
#define __TRUE__ 1 /* non-sign-extended TRUE */
#else
#define __TRUE__ (-1) /* sign-extended TRUE */
#endif
typedef enum {TRUE=__TRUE__, FALSE=0} bool; /* crypto-Wirthite */
typedef enum {true=__TRUE__, false=0} Boolean; /* Fundamentalist */
/* * * * * * * * * */
A suggestion to the C ANSI standards committee: to the extent that they are
defining the C preprocessor, I would like to see __TRUE__ available from cpp,
rather than be forced to use "#if this-machine-or-that" hacks.
This form could extend to any machine dependency allowed by the prevailing
language definition. I would, for the example above, happily settle for the
having __UBITFIELD__ auto-defined when bit fields are always unsigned; maybe
we could have __SCHAR__ for when there is no unsigned char, __CHARSX__ for
when char always gets sign-extended, and so on. The "compiler control
lines" have a bastard status within the language definition. Perhaps in
formalizing it, some of these issues could be addressed.
Living on the west coast, I can't make it to *one* ANSI committee meeting,
much less two in a row. Perhaps someone with a vote there could bring this
issue up for me?
---
[1] "Recent Changes to C", D. M. Ritchie, Nov 15, 1978.
[2] "The C Programming Language--Reference Manual", D. M. Ritchie, p. 13.
---
Michael Turner (ucbvax!ucbesvax.turner)
More information about the Comp.lang.c
mailing list