On Wed, Aug 29, 2012 at 3:59 PM, Paul Eggert <egg...@cs.ucla.edu> wrote:
> I'm no C++ expert but this one looks like there's a straightforward > fix: just use C++'s bool if available. That's what GCC's stdbool.h does, > anyway. With other compilers this may be an issue of C and C++ > disagree with how _Bool is implemented but I suppose we can burn > those bridges when we come to them. > > Here's the patch I installed into gnulib. > Please give it a try, and further patches are welcome. > > From 067dea8fdc99b30a826c0c8aff8060fe4f8095bf Mon Sep 17 00:00:00 2001 > From: Paul Eggert <egg...@cs.ucla.edu> > Date: Wed, 29 Aug 2012 07:52:32 -0700 > Subject: [PATCH] stdbool: be more compatible with mixed C/C++ compiles > > * lib/stdbool.in.h (_Bool, true, false) [__cplusplus]: > Define to bool, true, false, respectively, as GCC's builtin > stdbool.h does. Problem reported by Michael Goffioul in > <http://lists.gnu.org/archive/html/bug-gnulib/2012-08/msg00143.html>. > --- > ChangeLog | 8 ++++++++ > lib/stdbool.in.h | 48 +++++++++++++++++++++++++++++------------------- > 2 files changed, 37 insertions(+), 19 deletions(-) > > diff --git a/ChangeLog b/ChangeLog > index 63f651f..f484d28 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,3 +1,11 @@ > +2012-08-29 Paul Eggert <egg...@cs.ucla.edu> > + > + stdbool: be more compatible with mixed C/C++ compiles > + * lib/stdbool.in.h (_Bool, true, false) [__cplusplus]: > + Define to bool, true, false, respectively, as GCC's builtin > + stdbool.h does. Problem reported by Michael Goffioul in > + < > http://lists.gnu.org/archive/html/bug-gnulib/2012-08/msg00143.html>. > + > 2012-08-28 Jim Meyering <meyer...@redhat.com> > > revert last change: it was not needed > diff --git a/lib/stdbool.in.h b/lib/stdbool.in.h > index e58f211..924c8ff 100644 > --- a/lib/stdbool.in.h > +++ b/lib/stdbool.in.h > @@ -66,24 +66,18 @@ > # undef true > #endif > > -/* For the sake of symbolic names in gdb, we define true and false as > - enum constants, not only as macros. > - It is tempting to write > - typedef enum { false = 0, true = 1 } _Bool; > - so that gdb prints values of type 'bool' symbolically. But if we do > - this, values of type '_Bool' may promote to 'int' or 'unsigned int' > - (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int' > - (see ISO C 99 6.3.1.1.(2)). So we add a negative value to the > - enum; this ensures that '_Bool' promotes to 'int'. */ > -#if defined __cplusplus || (defined __BEOS__ && !defined __HAIKU__) > +#ifdef __cplusplus > +# define _Bool bool > +#else > +# if defined __BEOS__ && !defined __HAIKU__ > /* A compiler known to have 'bool'. */ > /* If the compiler already has both 'bool' and '_Bool', we can assume > they > are the same types. */ > -# if !@HAVE__BOOL@ > +# if !@HAVE__BOOL@ > typedef bool _Bool; > -# endif > -#else > -# if !defined __GNUC__ > +# endif > +# else > +# if !defined __GNUC__ > /* If @HAVE__BOOL@: > Some HP-UX cc and AIX IBM C compiler versions have compiler bugs > when > the built-in _Bool type is used. See > @@ -103,19 +97,35 @@ typedef bool _Bool; > "Invalid enumerator. (badenum)" with HP-UX cc on Tru64. > The only benefit of the enum, debuggability, is not important > with these compilers. So use 'signed char' and no enum. */ > -# define _Bool signed char > -# else > +# define _Bool signed char > +# else > /* With this compiler, trust the _Bool type if the compiler has it. */ > -# if !@HAVE__BOOL@ > +# if !@HAVE__BOOL@ > + /* For the sake of symbolic names in gdb, define true and false as > + enum constants, not only as macros. > + It is tempting to write > + typedef enum { false = 0, true = 1 } _Bool; > + so that gdb prints values of type 'bool' symbolically. But then > + values of type '_Bool' might promote to 'int' or 'unsigned int' > + (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int' > + (see ISO C 99 6.3.1.1.(2)). So add a negative value to the > + enum; this ensures that '_Bool' promotes to 'int'. */ > typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } > _Bool; > +# endif > # endif > # endif > #endif > #define bool _Bool > > /* The other macros must be usable in preprocessor directives. */ > -#define false 0 > -#define true 1 > +#ifdef __cplusplus > +# define false false > +# define true true > +#else > +# define false 0 > +# define true 1 > +#endif > + > #define __bool_true_false_are_defined 1 > > #endif /* _GL_STDBOOL_H */ > Thanks, that should indeed redefining true and false (I already tried that solution with octave and it solved the problem). But why also include the '#define bool _Bool' line in the patch and only do it in C? AFAIK "bool" is a standard C++ type, there's no need to redefine it. Michael.