Never understood why we needed a boolean type, myself. What is wrong with 1 and 0?
Now, this is not the same thing defining what exactly the truth test is. It's perfectly reasonable and arguably a good design to have both a narrow boolean type and a wide definition of truthiness.
If you treat it this way you remove the vast majority of the problems with most C or C++ BOOL implementations.
The low bytes of a pointer being 0 (It can happen on Windows with VirtualAlloc and company) can screw up the works, so avoid assigning a pointer to a BOOL and use BOOL b = !!pointer if you have to break that rule.
But some semantic maps are less great. Having your compiler help you to ensure you're not implicitly mixing up bad maps can be helpful.