- 
          
- 
                Notifications
    You must be signed in to change notification settings 
- Fork 7k
Description
It has come to my attention that the boolean type alias produces results differing to the C++ standard boolean type bool.
Consider this sketch:
void setup() {
  Serial.begin(9600);
  Serial.println( true == (bool) 57 ? "true" : "false" );
  Serial.println( true == (boolean)57 ? "true" : "false" );
  Serial.println( true == bool( true ) ? "true" : "false" );
  Serial.println( bool( 1 | 2 | 4 | 8 ) == boolean( 1 | 2 | 4 | 8 ) ? "true" : "false" );
  Serial.println( true == false + 1 ? "true" : "false" );
  Serial.println( true + true == true ? "true" : "false" );
  Serial.println( bool( true + true ) == true ? "true" : "false" );
  Serial.println( boolean( true + true ) == true ? "true" : "false" );
}
void loop(){}Using this sketch with boolean declared as a typedef to uint8_t ( which is what the current core does ) the output to the serial monitor is:
true
false
true
false
true
false
true
false
Whereas, after changing the core to allow a boolean to be declared as bool. The sketch produces this output:
true
true
true
true
true
false
true
true
It appears boolean has been implemented to provide boolean functionality with some C code in the Arduino core. I recommend changing the core so by the time boolean is seen by a sketch it is either a typedef or #define to the real bool type.
These are the modifications I propose be implemented in Arduino.h
#ifdef __cplusplus
    typedef bool boolean;
#else
    typedef uint8_t boolean;
    #define false 0
    #define true !false
#endifOn a side note, the defines for true and false should be removed. Boolean's ( the real one ) are subject to integral promotion and convert to either 0 or 1. Also the standard forbids macros named the same as keywords. If the C code needs defines, use TRUE & FALSE instead.
I have created a pull request here:
#2151
I also have a proof I'm in the middle of writing as to why the defines true and false need to be removed from the C++ side. I will add it soon.