BOOL, TRUE, FALSE



  • Zurück zur Ausgangsfrage:
    Soll man BOOL, TRUE, FALSE, ... verwenden oder bool, true, false ... ?
    (Thema wurde unten geschlossen)

    Da wir uns hier im C++-Forum befinden, sollte man eher zu true und false raten als zu TRUE und FALSE.

    Eine interessante Sache findet man, wenn man den aktuellen Dev-C++ einsetzt:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        bool flag = true;
        while(flag==true)
            for(int i=0; i<10; ++i)
            {
                 cout << "Hallo" << endl;
                 flag=false;
            }
        cin.get();    
    }
    

    Nun möchte jemand - warum auch immer - dies auf BOOL sowie TRUE und FALSE abändern.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        BOOL flag = TRUE;
        while(flag==TRUE)
            for(int i=0; i<10; ++i)
            {
                 cout << "Hallo" << endl;
                 flag=FALSE;
            }    
        cin.get();
    }
    

    In Dev-C++ 4.9.8.10 wird dies problemlos kompiliert! Kommentiert man #include <iostream> aus, so erhält man Fehlermeldungen ("... undeclared") für BOOL, TRUE, FALSE, cout, cin, endl. Das heisst, ein einfaches Inkludieren von <iostream> lässt das bereits zu. Man benötigt hierzu kein windef.h.

    Probiert man dieses Programm in MS VC++ 2005 (beta), so erhält man eine Fehlermeldung. Dort benötigt man einen Windows-Header.

    So unklar sieht die Landschaft immer noch aus.



  • Hi!

    Mich würde interessieren ob TRUE, FALSE, BOOL usw. zum Standard gehören oder nicht. Habe das abgesehen bei der Programmierung mit div. Bibliotheken in noch keinem Standard-C/C++ Programm gesehen noch irgendwo davon was gelesen.

    Oder ist das einfach nur implementierungsabhängig?

    Code-Hacker



  • Code-Hacker schrieb:

    Mich würde interessieren ob TRUE, FALSE, BOOL usw. zum Standard gehören oder nicht. Habe das abgesehen bei der Programmierung mit div. Bibliotheken in noch keinem Standard-C/C++ Programm gesehen noch irgendwo davon was gelesen.

    Nein, gehört nicht zum Standard. BOOL ist normalerweise ein int typedef, TRUE und FALSE sind defines.



  • Hi!

    Ok, dann lag ich also doch nicht falsch mit meiner Vermutung. Thx.

    Code-Hacker



  • Erhard Henkes schrieb:

    So unklar sieht die Landschaft immer noch aus.

    Wenn man einfach mal die Brille der Gewohnheit abnimmt und die Augen für ein paar simple Fakten öffnet, wird die Landschaft auch gleich viel klarer.

    Standard-C++ kennt weder TRUE, FALSE noch BOOL. Ende.

    Mich würde interessieren ob TRUE, FALSE, BOOL usw. zum Standard gehören oder nicht

    Doppelt hält besser: nein Standard-C++ kennt weder TRUE, FALSE noch BOOL. Ende.

    Damit wird das ganze eigentlich auch zu einem Selbstläufer:
    1. In Standard-C++ verwendet man den Standard-C++ Datentyp bool mit seinen beiden Standard-C++ Literalen true und false.

    2. Arbeite ich mit einer Bibliothek X oder eine Platform Y die typedefs wie BOOL, TRUE und FALSE definiert, dann muss ich mir anschauen warum diese typedefs existieren und ob ich von diesen typedefs in irgendeiner Form profitiere.
    Es gab z.B. Zeiten in denen einige C++ Compiler noch keinen bool-Typ kannten. In diesen Zeiten konnte man durch die Indirektion über BOOL die Portabilität des Codes verbessern.

    Heutzutage würde ich genrell auf die Verwendung von BOOL, TRUE, FALSE verzichten (Es sei denn eine Bibliothek/Platform nennt gute Gründe, warum man sie verwenden sollte). In Zeiten in denen jeder C++ Compiler bool unterstützt bringen BOOL, TRUE und FALSE keinen Mehrwert. Es handelt sich hier ja nicht um typedefs wie int32, also solche, die über die Indirektion eine bestimmte Repräsentation garantieren.

    Erhard Henkes schrieb:

    Nun möchte jemand - warum auch immer - dies auf BOOL sowie TRUE und FALSE abändern.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        BOOL flag = TRUE;
        while(flag==TRUE)
            for(int i=0; i<10; ++i)
            {
                 cout << "Hallo" << endl;
                 flag=FALSE;
            }    
        cin.get();
    }
    

    Das ist kein gültiges C++. Ein konformer Compiler sollte dieses Programm als fehlerhaft zurückweisen (alles andere wären hersteller-spezifische Erweiterungen die selbstverständlich unportabel sind).

    Wenn du also BOOL, TRUE, FALSE verwenden willst, dann musst du *explizit* einen Header inkludieren, der die nötigen typedefs enthält.



  • Ich benutze einfach true und false, weil der Editor es farblich hervorhebt, im Gegensatz zu TRUE und FALSE. Allein deshalb kommt es mir schon richtiger vor.

    BTW: Ist das nicht ne ziemlich lächerliche Diskussion? (Bitte nicht schlagen)



  • noebef schrieb:

    BTW: Ist das nicht ne ziemlich lächerliche Diskussion? (Bitte nicht schlagen)

    Nein, *plonk* 🤡



  • Standard-C++ kennt weder TRUE, FALSE noch BOOL. Ende.

    Bekannt. C++ verwendet bool, true, false.

    Ich war nur etwas erstaunt, dass Dev-C++, der ansonsten sehr nahe am C++-Standard ist, via <iostream> BOOL, TRUE und FALSE unterstützt. Darauf wollte ich aufmerksam machen.



  • @Erhardt
    trotzdem kein Grund das zu benutzen. Die C++ Library benutzt wahrscheinlich intern die WinAPI Funktionen und inkludiert so windef.h oder so was.

    Und warum sollte man auf die dumme Idee kommen, einen uralten C Workarroung (und C hat mittlerweile sogar einen Bool Typ) zu benutzen. Nicht nur das der Compiler das schlechter optimieren kann und der Code wie bereits gesagt nicht gehighlightet wird, man verliert auch noch Standardkompatibilität oder muss sich eigene Typedefs etc. einbauen, was ja IMHO Sinnlos und Zeitverschwendung ist.



  • Die C++ Library benutzt wahrscheinlich intern die WinAPI Funktionen und inkludiert so windef.h oder so was.

    Darüber war ich doch etwas erstaunt. Gerade bei Dev-C++ hätte ich dies nicht erwartet!

    Standardkompatibilität, Portabilität und Codehighlighting sprechen selbstverständlich für die in C++ eingebauten Datentypen und Literale. 🙂



  • kingruedi schrieb:

    und C hat mittlerweile sogar einen Bool Typ

    Der super im Vergleich zu den anderen Typen aussieht und sogar fast wie das C++ Äquivalent geschrieben wird (_Bool <-> bool). 🙄

    BOOL TRUE FALSE sollte imo niemand mehr verwenden, der nicht explicit was mit der WinAPI macht. Ich denke, selbst MS distanziert sich davon. Denn in den Managed C++ Funktionen von .NET, mit denen ich bisher zu tun hatte, wird selbst da mittlerweile bool true false genutzt.



  • groovemaster2002 schrieb:

    kingruedi schrieb:

    und C hat mittlerweile sogar einen Bool Typ

    Der super im Vergleich zu den anderen Typen aussieht und sogar fast wie das C++ Äquivalent geschrieben wird (_Bool <-> bool). 🙄

    Ich denke das haben die gemacht, weil viele sich bool schon selber definiert hatten. Darauf sollte ein Sprachstandard imho aber keine Rücksicht nehmen 🙄 . Gibt es eigentlich mittlerweile einen vollständigen C99-Compiler?



  • MaSTaH schrieb:

    Darauf sollte ein Sprachstandard imho aber keine Rücksicht nehmen 🙄 .

    Aber Compilerhersteller müssen Rücksicht auf ihre Kunden nehmen. Sie würden somit C99 nicht in dem Maße umsetzen, wie wenn der Standard doch Rücksicht genommen hätte. Glücklicherweise wird der Standard aber nicht von Gott persönlich erstellt, sondern von Compilerherstellern und Usern, so dass sich das Problem gar nicht erst ergibt 😉



  • @groovemaster2002
    dann inkludier mal stdbool.h da hast du dann auch bool und true und false 🙄

    @MaSTaH
    Der GCC unterstützt das sehr gut. Aber es gibt ja auch keinen Compiler, der den C++98 Standard 100% unterstützt.



  • Mag schon sein, ich denke aber im Falle eines C99 bool wäre der Aufwand für evtl. Codeanpassungen doch eher gering ausgefallen. Ein typedef oder define entfernen und Folgeschäden ausbessern (die eh nur auf unsauberes Programmieren hindeuten). Kann aber schon verstehen, wenn da Firmen nicht mitmachen, erst recht, wenn dies viele grosse Projekte betrifft. Naja, manchmal ist halt Engstirnigkeit auch nur Mittel zum Zweck.



  • @groovemaster
    aber vielleicht kannst du nicht immer einfach ein Suchen/Ersetzen durchführen, weil du zB. eine Binär Library hast, die bool definiert und dann würdest du ja die Binär Kompatibilität brechen, da das bool typedef und bool aus C99 (was ja deswegen _Bool heisst :)) nicht gleich groß oder alignet sein müssen.

    Und ich möchte nicht wissen, wie viele staubige alte Zeilen C Code überall rumfliegen und Dinge steuern, die wir nichtmal bemerken. Ich hätte zB. keine Lust mit dem Flugzeug abzustürzen, nur weil die vom Standardkomitee dachten "oh, machen wir aus _Bool bool" und irgend jemand sich dann Probleme mit irgend einer API einfängt.



  • Flugzeugsteuerungen werden *hoffentlich* nicht in C geschrieben 😉



  • Bashar schrieb:

    Flugzeugsteuerungen werden *hoffentlich* nicht in C geschrieben 😉

    wollte nur ein möglichst dramatisches Beispiel geben. Ich hätte auch Atomraketen-Abschuß-Steuerung, Stromnetz-Steuerung oder Atomkraftwerk-Steuerung etc. sagen können. Wobei man wohl bei allen hoffen darf, dass die irgend etwas selbst sichernderes genommen haben (ersteres ist wohl klar in ADA programmiert ;))



  • So langsam lichtet sich der Nebel. Vielleicht hat das C Standard Komitee _Bool ja deswegen so verunglimpft gewählt, da _Bool niemand nutzen soll. Wer trotzdem einen Wahrheitswert braucht und kein eigenes bool hat, nimmt bool aus stdbool.h welches wiederum auf _Bool umgeleitet wird.



  • _Bool wurde gewählt, weil schon alte Standards gesagt haben, dass ein Unterstrich und ein folgender Großbuchstabe dem Compiler/nächsten Standard gehört und nicht benutzt werden darf. Genauso ist das mit zwei unterstrichen. Ich glaub in der C++ FAQ steht auch was dazu


Log in to reply