Mail Archives: djgpp-workers/2004/01/08/18:52:32
Esa A E Peuha wrote:
> On Thu, 8 Jan 2004, CBFalconer wrote:
>
> > > #ifndef __dj_stdbool__h_
> > > #define __dj_stdbool__h_
> > >
> > > #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \
> > > || !defined(__STRICT_ANSI__)
> > >
> > > #define bool _Bool
> > > #define true 1
> > > #define false 0
> > > #define __bool_true_false_are_defined 1
> > >
> > > #endif /* (__STDC_VERSION__ >= 199901L) || !__STRICT_ANSI__ */
> > >
> > > #endif /* !__dj_stdbool__h_ */
> >
> > I question whether it is necessary to have the __STDC_VERSION etc.
> > guard, or even desirable.
>
> Yes, it is both. If the user asks for strict ANSI C89, then our
> headers must not define anything not in that standard, even if any
> specific header (like this one) isn't in the standard. Maybe we
> should add warnings like "#warn using stdbool.h while in strict
> ANSI C89 mode" (or even #error, since strict ANSI doesn't know
> about #warn).
On reconsideration I think you and Eli are right. However I would
separate out the strict part. The thing being guarded against is
the use of _Bool below C99, because it doesn't exist. Strict C89
is already eliminated. The #error could be a #else since below
C99 the header shouldn't exist either.
I routinely use the following header (which could use
improvement):
/* Standard defines of operators, usable on C90 up */
#ifndef stdops_h
#define stdops_h
#if defined(__STDC__) && (__STDC_VERSION__ >= 199901L)
/* The following from C99 - must define for C90 */
#include <stdbool.h> /* define bool, true, false */
#include <iso646.h> /* define not, and, or, xor */
#else
#define false 0
#define true 1
typedef int bool;
#define not !
#define and &&
#define or ||
#define xor ^
#endif
#endif
which handles the things I want to use.
--
Chuck F (cbfalconer AT yahoo DOT com) (cbfalconer AT worldnet DOT att DOT net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net> USE worldnet address!
- Raw text -