How to use boolean datatype in C?
Solution 1
If you have a compiler that supports C99 you can
#include <stdbool.h>
Otherwise, you can define your own if you'd like. Depending on how you want to use it (and whether you want to be able to compile your code as C++), your implementation could be as simple as:
#define bool int
#define true 1
#define false 0
In my opinion, though, you may as well just use int
and use zero to mean false and nonzero to mean true. That's how it's usually done in C.
Solution 2
C99 has a boolean datatype, actually, but if you must use older versions, just define a type:
typedef enum {false=0, true=1} bool;
Solution 3
C99 has a bool
type. To use it,
#include <stdbool.h>
Solution 4
As an alternative to James McNellis answer, I always try to use enumeration for the bool type instead of macros: typedef enum bool {false=0; true=1;} bool;
. It is safer b/c it lets the compiler do type checking and eliminates macro expansion races
Related videos on Youtube
itsaboutcode
Updated on July 13, 2020Comments
-
itsaboutcode almost 4 years
I was just writing code in C and it turns out it doesn't have a boolean/bool datatype. Is there any C library which I can include to give me the ability to return a boolean/bool datatype?
-
Rooke over 13 yearsUsually a plain old 'int' is used, with the assumption that 0 is 'false' and anything else is 'true'.
-
Jim Fell about 7 yearsPossible duplicate of Is bool a native C type?
-
-
itsaboutcode over 13 years@James, it worked. But what i should return? i mean 0 or false?
-
James McNellis over 13 years@ysap: I picked macros because it's closer to what C99 does (In C99,
true
andfalse
are both macros that are replaced by1
and0
, respectively, andbool
is a macro that expands to the boolean type,_Bool
. -
James McNellis over 13 years@its: If you define macros for
bool
,true
, andfalse
, then make your return typebool
and returnfalse
. Otherwise, just make your return typeint
and return0
. It's up to you waht you want to do. I just think the non-macro approach is better. -
ysap over 13 years@James - sorry, I messed up with this comment, erasing it while editing, so I reposted it as an answer. You were too fast to reply...
-
James McNellis over 13 yearsThis doesn't prevent you from saying
bool b = 1;
-
James McNellis over 13 yearsTo the best of my knowledge, there is no additional type checking over what you would get with a
#define bool int
. -
ysap over 13 yearsOh, I think I see what you mean. However, you are talking about the variable declaration, while I am relating to the actual usage of the true and false tokens.
-
caveman over 13 yearsI actually prefer in C to use 0 as false and non-zero as true w/o a specific type. In other cases where the call might fail, 0 is success and NZ is an error code (usually negative codes).
-
James McNellis over 13 yearsCan you give an example of where additional type checking is done?
-
ysap over 13 yearsWell, its hard indeed, but just an example:
float f; f = true;
should raise a warning for the implicit (and supposedly incompatible) type cast. -
ysap over 13 years@Paul - I'm curious - are you sure this is a problem? If my memory serves me right, then enums are treated as ints. Ain't so? If you are right then this is definitely a good counter-example.
-
Paul R over 13 years@ysap: you're quick ! I deleted that comment almost immediately because I wasn't sure if I had remembered the problem exactly - I've just been trying to recreate an issue I know I had a while back with enums and ++ but it's still eluding me.
-
R.. GitHub STOP HELPING ICE over 13 yearsIf you ask me, "emulating"
bool
pre-C99 is dangerous because the semantics differ.(bool)2
yields 2, not 1. A more realistic example:1U<<(bool)isdigit(c)
will give the wrong result on most implementations. -
Uyghur Lives Matter about 7 yearsJames McNellis's answer already says to do this.