bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: bool and C23


From: Bruno Haible
Subject: Re: bool and C23
Date: Sun, 21 Aug 2022 23:34:55 +0200

On Monday I wrote:
> > to exclude other problems, we need to check it on a platform-by-platform
> > basis.

This is the situation on the various platforms:

  * In C++ mode,
    - either the C <stdbool.h> is used,
    - or a C++ <stdbool.h> exists that
        #include <cstdbool>
    - or a C++ <stdbool.h> exists that #include <__config>,
      and the latter does:
        Linux: #include <features.h>
        FreeBSD: #include <sys/endian.h>, #include <osreldate.h>
        NetBSD: #include <sys/endian.h>
        Windows store apps: #include <winapifamily.h>
        Solaris: #include <sys/isa_defs.h>
        else: #include <endian.h>

    The latter includes various OS stuff, and should therefore be
    avoided when possible. Since a compilation unit cannot be ISO C 23
    and C++ at the same time, it is easy to achieve: Wrap the new
    config.h additions in
      #ifndef __cplusplus
      ...
      #endif

  * In C mode: <stdbool.h> does

    AIX: #include <standards.h>, defines only macros
    FreeBSD: self-contained
    Haiku: self-contained
    HP-UX: #include <sys/stdsyms.h>, defines only macros
    macOS: self-contained
    mingw: self-contained
    Minix: self-contained
    musl: self-contained
    NetBSD: self-contained
    OpenBSD: self-contained
    Solaris 10: #include <sys/feature_tests.h> -> #include <sys/ccompile.h>, 
#include <sys/isa_defs.h>, defines only macros
    Solaris 11: #include <sys/feature_tests.h>

    So, in this case, it is OK to #include <stdbool.h>, since it
    does not include header files with function declarations, only
    header files with macro definitions.

Paul Eggert wrote:
> In the long run this problem will vanish, as in the long run config.h 
> will do nothing (that's all that's needed for C23 and C++).

I agree.

> In the shorter run I think we'll be OK for C17 and earlier if we include 
> <stdbool.h> on platforms where bool+true+false don't work out of the 
> box, because (unlike some other .h files) stdbool.h doesn't tend to 
> cause conflicts.

Yes. Based on the analysis above, this should work.

So, IIUC, what we should do, is:

  - Determine GL_GENERATE_STDBOOL_H as in gnulib/m4/stdbool.m4,
  - If it is true, add to <config.h> the lines

      #ifndef __cplusplus
      ... current contents of gnulib/m4/stdbool.in.h ...
      #endif

  - Otherwise, test "$ac_cv_header_stdbool_h".
  - If it is != 'yes', add to <config.h> the lines

      #ifndef __cplusplus
      #include <stdbool.h>
      #endif

Bruno






reply via email to

[Prev in Thread] Current Thread [Next in Thread]