Jump to content

  • Log In with Google      Sign In   
  • Create Account


Win32 BOOL and bool ?

  • You cannot reply to this topic
10 replies to this topic

#1 Endemoniada   Members   -  Reputation: 289

Like
0Likes
Like

Posted 14 July 2014 - 03:34 PM

Hi guys,

 

In Win32 (Visual Studio) is bool exactly the same as BOOL ?

 

What exactly is BOOL ?

 

typedef int BOOL

or maybe

#define BOOL int

or something else ?

 

I'd rather use bool but want to make sure it's really the same.

 

Thank you.

 



Sponsor:

#2 fastcall22   Crossbones+   -  Reputation: 3930

Like
3Likes
Like

Posted 14 July 2014 - 03:36 PM

The Win32 API is a C library. C does not have a boolean type. Therefore, Win32 has defined BOOL as being an integer having zero and nonzero for false and true respectively.

EDIT:
See Win32 Data Types.

Edited by fastcall22, 14 July 2014 - 03:40 PM.

WW91J3ZlIGdvdCBhIHNlY3JldCBib251cyBwb2ludCE=


#3 Washu   Senior Moderators   -  Reputation: 4459

Like
9Likes
Like

Posted 14 July 2014 - 03:37 PM

bool is a C++ type, BOOL is a win32 typedef for int, but the underlying type should not matter (hence why its typedeffed).

 

If you're writing a C++ app, use bool, if you're interfacing with Win32, use BOOL.


In time the project grows, the ignorance of its devs it shows, with many a convoluted function, it plunges into deep compunction, the price of failure is high, Washu's mirth is nigh.
ScapeCode - Blog | SlimDX


#4 SiCrane   Moderators   -  Reputation: 9386

Like
8Likes
Like

Posted 14 July 2014 - 09:32 PM

Note that sometimes the use of BOOL in the Windows API is a lie and is not actually a boolean. For the GetMessage() function, 0 indicates WM_QUIT, non-zero indicates a non-WM_QUIT message except for -1 which means an error. 



#5 rnlf   Members   -  Reputation: 1091

Like
0Likes
Like

Posted 15 July 2014 - 02:26 AM

Note that sometimes the use of BOOL in the Windows API is a lie and is not actually a boolean. For the GetMessage() function, 0 indicates WM_QUIT, non-zero indicates a non-WM_QUIT message except for -1 which means an error. 

wacko.png WAT?

 

Are they crazy? (Rhetorical question).

 

I actually had to double-check that info on MSDN, I thought you were trolling. But you're not. And that frightens me to death.


my blog (German)


#6 mhagain   Crossbones+   -  Reputation: 7413

Like
1Likes
Like

Posted 15 July 2014 - 06:20 AM

 

Note that sometimes the use of BOOL in the Windows API is a lie and is not actually a boolean. For the GetMessage() function, 0 indicates WM_QUIT, non-zero indicates a non-WM_QUIT message except for -1 which means an error. 

wacko.png WAT?

 

Are they crazy? (Rhetorical question).

 

I actually had to double-check that info on MSDN, I thought you were trolling. But you're not. And that frightens me to death.

 

 

There's probably a legacy reason for that - maybe something to do with the original GetMessage in an earlier version of Windows returning a strict BOOL, but when they moved it to 32-bit (or something else, I don't know) they needed to return another value but couldn't change the function signature for compatibility reasons.  Windows is full of stuff like that - check out Raymond Chen's blog for more info.


It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#7 rnlf   Members   -  Reputation: 1091

Like
0Likes
Like

Posted 15 July 2014 - 06:47 AM

In that case, they have made a function with a completely different interface that actually breaks backward compatibility. They could as well have renamed the return type at the same time or made a second function.


my blog (German)


#8 mhagain   Crossbones+   -  Reputation: 7413

Like
2Likes
Like

Posted 15 July 2014 - 07:13 AM

In that case, they have made a function with a completely different interface that actually breaks backward compatibility. They could as well have renamed the return type at the same time or made a second function.

 

Ahh, here we go: http://blogs.msdn.com/b/oldnewthing/archive/2013/03/22/10404367.aspx

 

We can infer from that (and the "somebody said" linked post) that the addition of -1 as a return code happened during the changeover from Windows 3.0 and 3.1 when parameter validation was added to these functions.  As for the alternatives you suggest in your second sentence, I obviously don't know the reason why they didn't, but I'm going to assume that there was such a reason.


Edited by mhagain, 15 July 2014 - 07:25 AM.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#9 SiCrane   Moderators   -  Reputation: 9386

Like
1Likes
Like

Posted 15 July 2014 - 08:33 PM

I actually had to double-check that info on MSDN, I thought you were trolling. But you're not. And that frightens me to death.

When it comes to the Windows API, you don't need to make stuff up. For that matter I couldn't make some of this stuff up if I tried. Another true but unbelievable detail about BOOL: there's not just one typedef or two typedefs for boolean types in the API, but three of them (that I know about): BOOL, BOOLEAN and VARIANT_BOOL. They are respectively, 4 bytes, 1 byte and 2 bytes. VARIANT_BOOL is especially interesting because it doesn't use non-zero for true but specifically 0xffff (-1 as a short). Also BOOL and VARIANT_BOOL are signed, and BOOLEAN is unsigned. BOOLEAN is a fun one because you can do accidental integer conversions that don't mean what you think they do. bool(my_int) means true if my_int is non-zero. BOOLEAN(my_int) means take the least significant byte (in other words 256 would look like false).

#10 mhagain   Crossbones+   -  Reputation: 7413

Like
2Likes
Like

Posted 16 July 2014 - 06:12 AM

BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool

 

Again, there's a reason for everything.  I'm not necessarily saying that all of them are good reasons, just that they are reasons.

 

i guess that this is a characteristic of an API that's developed over 30-odd years.  We see the same in legacy OpenGL where there are often 5 different ways of doing the same thing, and not consistently specified.


It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#11 Endurion   Crossbones+   -  Reputation: 3328

Like
3Likes
Like

Posted 16 July 2014 - 08:04 AM

The consensus for the Windows defined types is, usually you DO NOT mix them. Pass a BOOL to a BOOL etc. Don't assume, just because they sound samey, that they are the same. There's usually a reason why they added a new type instead of reusing an existing one.
Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>





PARTNERS