How to use boolean datatype in C?

219,059

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

Share:
219,059

Related videos on Youtube

itsaboutcode
Author by

itsaboutcode

Updated on July 13, 2020

Comments

  • itsaboutcode
    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
      Rooke over 13 years
      Usually a plain old 'int' is used, with the assumption that 0 is 'false' and anything else is 'true'.
    • Jim Fell
      Jim Fell about 7 years
      Possible duplicate of Is bool a native C type?
  • itsaboutcode
    itsaboutcode over 13 years
    @James, it worked. But what i should return? i mean 0 or false?
  • James McNellis
    James McNellis over 13 years
    @ysap: I picked macros because it's closer to what C99 does (In C99, true and false are both macros that are replaced by 1 and 0, respectively, and bool is a macro that expands to the boolean type, _Bool.
  • James McNellis
    James McNellis over 13 years
    @its: If you define macros for bool, true, and false, then make your return type bool and return false. Otherwise, just make your return type int and return 0. It's up to you waht you want to do. I just think the non-macro approach is better.
  • ysap
    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
    James McNellis over 13 years
    This doesn't prevent you from saying bool b = 1;
  • James McNellis
    James McNellis over 13 years
    To the best of my knowledge, there is no additional type checking over what you would get with a #define bool int.
  • ysap
    ysap over 13 years
    Oh, 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
    caveman over 13 years
    I 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
    James McNellis over 13 years
    Can you give an example of where additional type checking is done?
  • ysap
    ysap over 13 years
    Well, its hard indeed, but just an example: float f; f = true; should raise a warning for the implicit (and supposedly incompatible) type cast.
  • ysap
    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
    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
    R.. GitHub STOP HELPING ICE over 13 years
    If 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
    Uyghur Lives Matter about 7 years
    James McNellis's answer already says to do this.