tags:

views:

2859

answers:

9

I got this doubt while writing some code. Is 'bool' a basic datatype defined in the C++ standard or is it some sort of extension provided by the compiler ? I got this doubt because Win32 has 'BOOL' which is nothing but a typedef of long. Also what happens if I do something like this:

int i = true;

Is it "always" guaranteed that variable i will have value 1 or is it again depends on the compiler I am using ? Further for some Win32 APIs which accept BOOL as the parameter what happens if I pass bool variable?

+29  A: 

bool is a fundamental datatype in C++. Converting true to an integer type will yield 1, and converting false will yield 0 (4.5/4 and 4.7/4). In C, until C99, there was no bool datatype, and people did stuff like

enum bool {
    false, true
};

So did the Windows API. Starting with C99, we have _Bool as a basic data type. Including stdbool.h will typedef #define that to bool and provide the constants true and false. They didn't make bool a basic data-type (and thus a keyword) because of compatibility issues with existing code.

Johannes Schaub - litb
+1  A: 

C++ does lots of automatic casting for you - that is, if you have a variable of type bool and pass it to something expecting an int, it will make it into an int for you - 0 for false and 1 for true.

I don't have my standard around to see if this is guaranteed, but every compiler I've used does this (so one can assume it will always work).

However, relying on this conversion is a bad idea. Code can stop compiling if a new method is added that overloads the int signature, etc.

hazzen
A: 

yes, it was introduced in 1993.

for further reference: Boolean Datatype

John T
A: 

If you are worried about the underling implementation you can

#define TRUE   1
#define FALSE  0

Then you always know what the value is going to be.

lillq
Bad idea. Trust the standard rather than creating your own alternative.
James Curran
Well, it's a bad idea in general, but "for some Win32 APIs which accept BOOL as the parameter" that Naveen refers to, TRUE and FALSE -- which are already #defined in the windows headers -- are preferred.
Die in Sente
Don't forget FILE_NOT_FOUND - http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx ;v)
Fred Larson
+3  A: 

Yes, bool is a built-in type.

WIN32 is C code, not C++, and C does not have a bool, so they provide their own typedef BOOL.

jalf
C does have a bool now, but it didn't way back when the win32 api first came into existence.
Joel Coehoorn
There's also BOOLEAN and VARIANT_BOOL: see http://blogs.msdn.com/oldnewthing/archive/2004/12/22/329884.aspx
Adam Rosenfield
Joel: Ok, Win32 is C89 then, which doesn't have a bool. ;)
jalf
+2  A: 

Let me google that for you . . . oh look here It says,

During its standardization process, the C++ programming language introduced the bool, true and false keywords, adding a native datatype to support boolean data. Its size is implementation defined. bool was introduced in 1993.

Binary Worrier
+7  A: 

Some great background on why C++ needs a built-in bool type: Guru of the Week #26

James Hopkin
A: 

C is meant to be a step above assembly language. The C if-statement is really just syntactical sugar for "branch-if-zero", so the idea of booleans as an independent datatype was a foreign concept at the time. (1)

Even now, C/C++ booleans are usually little more than an alias for a single byte data type. As such, it's really more of a purposing label than an independent datatype.

(1) Of course, modern compilers are a bit more advanced in their handling of if statements. This is from the standpoint of C as a new language.

jdmichal
A: 

Allthough it's now a native type, it's still defined behind the scenes as an integer (int I think) where the literal false is 0 and true is 1. But I think all logic still consider anything but 0 as true, so strictly speaking the true literal is probably a keyword for the compiler to test if something is not false.

if(someval == true){

probably translates to:

if(someval !== false){ // e.g. someval !== 0

by the compiler

Stein G. Strindhaug
It might be possible to implement it that way, but, at least in the case of VC++, the 4 bytes underlying a bool value are always set to 0 or 1.
James Hopkin
By which I mean, the four bytes *interpreted as an int* have the value 0 or 1
James Hopkin