Jump to content

  • Log In with Google      Sign In   
  • Create Account

Win32 BOOL and bool ?


Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.


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

#1 Endemoniada   Members   -  Reputation: 423

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.

 



#2 fastcall22   Crossbones+   -  Reputation: 8926

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.

gzip: H4sIAAAAAAAEAG1QTUvEMBC991e8nvaiFfYoS7yo sLCo6MnjtJ1ugmkiyWRL/72z3T1YEQIJ8z4zA2Xp yPvt1qBpGrRFIJZkk9FyRyUzHCbKIHgn4hnZOrm1 TD0mG0HCCs+QGDGWziKXI6Wm2n++GYwUVH2mrGEE PnGCVQ8K8+JYfXA6URDEQfMZh5h6g5eoAlWJdeEI bbH2qYZf7XMUfw8f/Q0oMeZYNL9/WHF0uFEshvMr XYujd9SycFb+F18QcSOvlJauZ8ejqevdnV7/d550 e0t6prmunh73Bu+vz4c/XUeOQXfJgvKNkhf95U8/ Dtgmy5IBAAA=

#3 Washu   Senior Moderators   -  Reputation: 7586

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: 11291

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: 1676

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.



#6 mhagain   Crossbones+   -  Reputation: 11711

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: 1676

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.



#8 mhagain   Crossbones+   -  Reputation: 11711

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: 11291

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: 11711

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: 4848

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>




Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.




PARTNERS