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   Members   

425
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   Moderators   

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

zlib: eJzVVLsSAiEQ6/1qCwoK i7PxA/2S2zMOZljYB1TO ZG7OhUtiduH9egZQCJH9 KcJyo4Wq9t0/RXkKmjx+ cgU4FIMWHhKCU+o/Nx2R LEPgQWLtnfcErbiEl0u4 0UrMghhZewgYcptoEF42 YMj+Z1kg+bVvqxhyo17h nUf+h4b2W4bR4XO01TJ7 qFNzA7jjbxyL71Avh6Tv odnFk4hnxxAf4w6496Kd OgH7/RxC

#3   Senior Moderators   

7712
Like
9Likes
Like

Posted 14 July 2014 - 03:37 PM

*
POPULAR

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   Moderators   

11522
Like
8Likes
Like

Posted 14 July 2014 - 09:32 PM

*
POPULAR

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   Members   

1775
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   Members   

12429
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   Members   

1775
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   Members   

12429
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   Moderators   

11522
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   Members   

12429
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   Members   

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