49

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?

2
  • 4
    Usually a plain old 'int' is used, with the assumption that 0 is 'false' and anything else is 'true'. Commented Nov 11, 2010 at 22:09
  • Possible duplicate of Is bool a native C type? Commented Jun 7, 2017 at 14:45

7 Answers 7

76

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.

Sign up to request clarification or add additional context in comments.

5 Comments

@James, it worked. But what i should return? i mean 0 or false?
@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.
@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.
@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...
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).
18

C99 has a boolean datatype, actually, but if you must use older versions, just define a type:

typedef enum {false=0, true=1} bool;

1 Comment

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.
6

C99 has a bool type. To use it,

#include <stdbool.h>

1 Comment

James McNellis's answer already says to do this.
1

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

7 Comments

This doesn't prevent you from saying bool b = 1;
To the best of my knowledge, there is no additional type checking over what you would get with a #define bool int.
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.
Can you give an example of where additional type checking is done?
Well, its hard indeed, but just an example: float f; f = true; should raise a warning for the implicit (and supposedly incompatible) type cast.
|
0

C99 introduced _Bool as intrinsic pure boolean type. No #includes needed:

int main(void)
{
  _Bool b = 1;
  b = 0;
}

On a true C99 (or higher) compliant C compiler the above code should compile perfectly fine.

Comments

0

We can use enum type for this.We don't require a library. For example

           enum {false,true};

the value for false will be 0 and the value for true will be 1.

Comments

-3
struct Bool {
    int true;
    int false;
}

int main() {

    /* bool is a variable of data type – bool*/
    struct Bool bool;

    /*below I’m accessing struct members through variable –bool*/ 
    bool = {1,0};
    print("Student Name is: %s", bool.true);
    return 0;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.