c + + - Hvad er forskellen mellem falsk og falsk?

Indlæg af Hanne Mølgaard Plasc

Problem



I mange programmer ser jeg udsagn med identifikatorerne FALSE og false. Er der nogen forskel mellem dem i forbindelse med C ++?


Også i nogle programmer så jeg bool og et sted BOOL. Hvad er forskellen mellem begge disse?


Kan nogen forklare forskellen mellem disse identifikatorer til mig? Tak.

Bedste reference


Hvis du har inkluderet windows.h, er FALSE #defined som 0. TRUE er #defined som 1. Det er ikke en boolsk type, det ' s en heltalstype. Windows definerede også typen BOOL, som faktisk er en heltalstype designet til at imødekomme værdierne TRUE og FALSE.


De relevante dele af kode i windows.h ser noget sådan ud:


#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0

#ifdef TRUE
#undef TRUE
#endif
#define TRUE  1

typedef int    BOOL,    *PBOOL,    *LPBOOL;


Windows blev oprindeligt skrevet i C, ligesom alle de oprindelige Windows-applikationer. På det tidspunkt havde C ikke en boolsk type defineret af standarden. I stedet blev udviklere tvunget til at definere deres egne boolske konstanter. For at forhindre det mulige rod, der kunne forårsage, besluttede Microsoft for en standard, der ville blive brugt til alle Windows-programmer.


Hvis du skriver Windows-programmer, skal du muligvis stadig bruge identifikatorerne TRUE og FALSE. Flere af de funktioner, der er defineret i windows.h accepterer enten boolske parametre (faktisk heltall!) Skrevet som BOOL eller returværdier af en sådan type. C ++, der er stærkt skrevet, kan klage, hvis du taler disse til den boolske type, der er defineret i sprogets standard. For konsistens bruger jeg de gamle identifikatorer i alle mine opkald til Windows API-funktioner og de true og false nøgleord, der nu defineres af standarden i alle de metoder, jeg skriver mig selv.


Der er virkelig ingen grund til ikke at bruge FALSE som det er defineret i windows.h. Men du bør ikke definere det selv i en proprietær headerfil, som andre har nævnt, fordi der ikke er nogen garanti at definitionen forbliver konstant over tid. Det kan forårsage nogle temmelig dumme fejl, den type der kvalificerer sig til at blive vist på Daily WTF.


Mat's svar er 100\% korrekt, at hverken TRUE eller FALSE er defineret af C- eller C ++-standarderne. De er dog strengt defineret af Windows API og garanteret ikke at ændre. Brug af dem vil ikke producere virkelig platforme, der er strenge standarder, der er kompatible med C ++, men det er sjældent en bekymring, når du skriver Windows-apps, da ingen af ​​de andre funktioner vil kalde windows.h.

Andre referencer 1


FALSE er ikke defineret i standarden. Kun false er. true og false kaldes 'boolske bogstaver', og er nøgleord i C ++.


FALSE er undertiden defineret som en makro. Du kan ikke stole på at den er til stede i et miljøvenligt miljø, da det ikke er en del af standarden.


Med andre ord er følgende program gyldigt C++:


#include <iostream>

#define FALSE 1

int main()
{
    bool a = false;
    bool b = FALSE;
    std::cout << a << " " << b << std::endl;
    return 0;
}


og det vil udskrive 0 1 som forventet. FALSE er ikke et privilegeret symbol på nogen måde.

Andre referencer 2


i C ++ er false en indbygget bogstavelig type boolsk, der repræsenterer den falske værdi (den anden mulige værdi er repræsenteret med den bogstavelige true )


FALSE er en #define hvis definition afhænger af platformen, men generelt er det 0.

Andre referencer 3


false er et C + + søgeord.


FALSE er ikke defineret af C ++-standarden. Men de fleste kompilatorer har FALSE defineret som en præprocessor-makro med værdien 0.

Andre referencer 4


Bare husk hvad sande og falske boolesker altid betyder. De vil altid være heltal (0,1). En kompilator kan muligvis ikke genkende det, men de vil altid blive gemt og løbe gennem CPU'en som heltal. En debugger vil vise dette. Uanset om det er i hætter eller ej, betyder det ikke rigtig noget, fordi der ikke skal være anderledes i implementeringen eller brugen. Hvis du har compiler, har nogle makroer skrevet til at understøtte både store og små bogstaver sandt og falsk så godt, men det passer bare til din behov ligesom alle andre typer.

Andre referencer 5


Vigtigt notat om Windows API: nogle WIndows-biblioteksfunktioner returnerer vilkårlige heltalværdier, selvom returnertypen er defineret som BOOL. Det er bedst aldrig at sammenligne en BOOL til TRUE. brug


  bSomeVal != FALSE instead.