I've noticed that the Linux kernel code uses bool, but I thought that bool was a C++ type. Is bool a standard C extension (e.g., ISO C90) or a GCC extension?
11 Answers
bool
exists in the current C - C99, but not in C89/90.
In C99 the native type is actually called _Bool
, while bool
is a standard library macro defined in stdbool.h
(which expectedly resolves to _Bool
). Objects of type _Bool
hold either 0 or 1, while true
and false
are also macros from stdbool.h
.
Note, BTW, that this implies that C preprocessor will interpret #if true
as #if 0
unless stdbool.h
is included. Meanwhile, C++ preprocessor is required to natively recognize true
as a language literal.
C99 added a builtin _Bool
data type (see Wikipedia for details), and if you #include <stdbool.h>
, it provides bool
as a macro to _Bool
.
You asked about the Linux kernel in particular. It assumes the presence of _Bool
and provides a bool
typedef itself in include/linux/types.h.
C99 has it in stdbool.h, but in C90 it must be defined as a typedef or enum:
typedef int bool;
#define TRUE 1
#define FALSE 0
bool f = FALSE;
if (f) { ... }
Alternatively:
typedef enum { FALSE, TRUE } boolean;
boolean b = FALSE;
if (b) { ... }
No, there is no bool
in ISO C90.
Here's a list of keywords in standard C (not C99):
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
static
struct
switch
typedef
union
unsigned
void
volatile
while
Here's an article discussing some other differences with C as used in the kernel and the standard: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
C99 added a bool
type whose semantics are fundamentally different from those of just about all integer types that had existed before in C, including user-defined and compiler-extension types intended for such purposes, and which some programs may have "type-def"ed to bool
.
For example, given bool a = 0.1, b=2, c=255, d=256;
, the C99 bool
type would set all four objects to 1. If a C89 program used typedef unsigned char bool
, the objects would receive 0, 1, 255, and 0, respectively. If it used char
, the values might be as above, or c
might be -1. If it had used a compiler-extension bit
or __bit
type, the results would likely be 0, 0, 1, 0 (treating bit
in a way equivalent to an unsigned bit-field of size 1, or an unsigned integer type with one value bit).
-std=gnu89
which supports_Bool
as an extension to C90. "include/linux/types.h" hastypedef _Bool bool;
. – Ian Abbotttypedef _Bool bool;
(commit 6e21828743247270d09a86756a0c11702500dbfb) and it required GNU C 3.2 or later. – Ian Abbott