stdbool.in.h revision 1.1 1 1.1 christos /* Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc.
2 1.1 christos Written by Bruno Haible <haible (at) clisp.cons.org>, 2001.
3 1.1 christos
4 1.1 christos This program is free software; you can redistribute it and/or modify
5 1.1 christos it under the terms of the GNU General Public License as published by
6 1.1 christos the Free Software Foundation; either version 3, or (at your option)
7 1.1 christos any later version.
8 1.1 christos
9 1.1 christos This program is distributed in the hope that it will be useful,
10 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
11 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 1.1 christos GNU General Public License for more details.
13 1.1 christos
14 1.1 christos You should have received a copy of the GNU General Public License
15 1.1 christos along with this program; if not, see <https://www.gnu.org/licenses/>. */
16 1.1 christos
17 1.1 christos #ifndef _GL_STDBOOL_H
18 1.1 christos #define _GL_STDBOOL_H
19 1.1 christos
20 1.1 christos /* ISO C 99 <stdbool.h> for platforms that lack it. */
21 1.1 christos
22 1.1 christos /* Usage suggestions:
23 1.1 christos
24 1.1 christos Programs that use <stdbool.h> should be aware of some limitations
25 1.1 christos and standards compliance issues.
26 1.1 christos
27 1.1 christos Standards compliance:
28 1.1 christos
29 1.1 christos - <stdbool.h> must be #included before 'bool', 'false', 'true'
30 1.1 christos can be used.
31 1.1 christos
32 1.1 christos - You cannot assume that sizeof (bool) == 1.
33 1.1 christos
34 1.1 christos - Programs should not undefine the macros bool, true, and false,
35 1.1 christos as C99 lists that as an "obsolescent feature".
36 1.1 christos
37 1.1 christos Limitations of this substitute, when used in a C89 environment:
38 1.1 christos
39 1.1 christos - <stdbool.h> must be #included before the '_Bool' type can be used.
40 1.1 christos
41 1.1 christos - You cannot assume that _Bool is a typedef; it might be a macro.
42 1.1 christos
43 1.1 christos - Bit-fields of type 'bool' are not supported. Portable code
44 1.1 christos should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
45 1.1 christos
46 1.1 christos - In C99, casts and automatic conversions to '_Bool' or 'bool' are
47 1.1 christos performed in such a way that every nonzero value gets converted
48 1.1 christos to 'true', and zero gets converted to 'false'. This doesn't work
49 1.1 christos with this substitute. With this substitute, only the values 0 and 1
50 1.1 christos give the expected result when converted to _Bool' or 'bool'.
51 1.1 christos
52 1.1 christos - C99 allows the use of (_Bool)0.0 in constant expressions, but
53 1.1 christos this substitute cannot always provide this property.
54 1.1 christos
55 1.1 christos Also, it is suggested that programs use 'bool' rather than '_Bool';
56 1.1 christos this isn't required, but 'bool' is more common. */
57 1.1 christos
58 1.1 christos
59 1.1 christos /* 7.16. Boolean type and values */
60 1.1 christos
61 1.1 christos /* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
62 1.1 christos definitions below, but temporarily we have to #undef them. */
63 1.1 christos #if defined __BEOS__ && !defined __HAIKU__
64 1.1 christos # include <OS.h> /* defines bool but not _Bool */
65 1.1 christos # undef false
66 1.1 christos # undef true
67 1.1 christos #endif
68 1.1 christos
69 1.1 christos #ifdef __cplusplus
70 1.1 christos # define _Bool bool
71 1.1 christos # define bool bool
72 1.1 christos #else
73 1.1 christos # if defined __BEOS__ && !defined __HAIKU__
74 1.1 christos /* A compiler known to have 'bool'. */
75 1.1 christos /* If the compiler already has both 'bool' and '_Bool', we can assume they
76 1.1 christos are the same types. */
77 1.1 christos # if !@HAVE__BOOL@
78 1.1 christos typedef bool _Bool;
79 1.1 christos # endif
80 1.1 christos # else
81 1.1 christos # if !defined __GNUC__
82 1.1 christos /* If @HAVE__BOOL@:
83 1.1 christos Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
84 1.1 christos the built-in _Bool type is used. See
85 1.1 christos https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
86 1.1 christos https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
87 1.1 christos https://lists.gnu.org/r/bug-coreutils/2005-10/msg00086.html
88 1.1 christos Similar bugs are likely with other compilers as well; this file
89 1.1 christos wouldn't be used if <stdbool.h> was working.
90 1.1 christos So we override the _Bool type.
91 1.1 christos If !@HAVE__BOOL@:
92 1.1 christos Need to define _Bool ourselves. As 'signed char' or as an enum type?
93 1.1 christos Use of a typedef, with SunPRO C, leads to a stupid
94 1.1 christos "warning: _Bool is a keyword in ISO C99".
95 1.1 christos Use of an enum type, with IRIX cc, leads to a stupid
96 1.1 christos "warning(1185): enumerated type mixed with another type".
97 1.1 christos Even the existence of an enum type, without a typedef,
98 1.1 christos "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
99 1.1 christos The only benefit of the enum, debuggability, is not important
100 1.1 christos with these compilers. So use 'signed char' and no enum. */
101 1.1 christos # define _Bool signed char
102 1.1 christos # else
103 1.1 christos /* With this compiler, trust the _Bool type if the compiler has it. */
104 1.1 christos # if !@HAVE__BOOL@
105 1.1 christos /* For the sake of symbolic names in gdb, define true and false as
106 1.1 christos enum constants, not only as macros.
107 1.1 christos It is tempting to write
108 1.1 christos typedef enum { false = 0, true = 1 } _Bool;
109 1.1 christos so that gdb prints values of type 'bool' symbolically. But then
110 1.1 christos values of type '_Bool' might promote to 'int' or 'unsigned int'
111 1.1 christos (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
112 1.1 christos (see ISO C 99 6.3.1.1.(2)). So add a negative value to the
113 1.1 christos enum; this ensures that '_Bool' promotes to 'int'. */
114 1.1 christos typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
115 1.1 christos # endif
116 1.1 christos # endif
117 1.1 christos # endif
118 1.1 christos # define bool _Bool
119 1.1 christos #endif
120 1.1 christos
121 1.1 christos /* The other macros must be usable in preprocessor directives. */
122 1.1 christos #ifdef __cplusplus
123 1.1 christos # define false false
124 1.1 christos # define true true
125 1.1 christos #else
126 1.1 christos # define false 0
127 1.1 christos # define true 1
128 1.1 christos #endif
129 1.1 christos
130 1.1 christos #define __bool_true_false_are_defined 1
131 1.1 christos
132 1.1 christos #endif /* _GL_STDBOOL_H */
133