Sollte man in C++ 'NULL' oder '0' für Pointer-initialisierungen nehmen?



  • Mhh,
    also eigentlich komme ich auch gut damit klar NULL nicht mehr zu verwenden aber ich denke doch ein Argument steht immer noch dafür: man sieht sofort dasss es ich um einen Pointer handelt



  • LukasBanana schrieb:

    Mhh,
    also eigentlich komme ich auch gut damit klar NULL nicht mehr zu verwenden aber ich denke doch ein Argument steht immer noch dafür: man sieht sofort dasss es ich um einen Pointer handelt

    und da NULL kein Zeiger ist, ist genau dass das gegen argument 😉 weil es eben wie zeiger aussieht aber keiner ist...

    mit nullptr wird sowieso alles anders...



  • LukasBanana schrieb:

    Mhh,
    also eigentlich komme ich auch gut damit klar NULL nicht mehr zu verwenden aber ich denke doch ein Argument steht immer noch dafür: man sieht sofort dasss es ich um einen Pointer handelt

    Und was fuer ein Vorteil hast du davon? Ob eine Variable ein Pointer oder ein Int ist, siehst du doch sowieso auf den ersten Blick anhand daran, wie sie verwendet wird o_0



  • Ich benutze immer 0x0, dann sieht man so schön, dass damit eine Adresse gemeint ist imho 🙂


  • Mod

    Blue-Tiger schrieb:

    Und was fuer ein Vorteil hast du davon? Ob eine Variable ein Pointer oder ein Int ist, siehst du doch sowieso auf den ersten Blick anhand daran, wie sie verwendet wird o_0

    Mit diesem Argument lässt sich noch der Sieger eines Obfuscation-Contests verteidigen: alles was du tun musst, um den Sinn zu verstehen, ist das Programm zu analysieren. Benutzt man NULL tatsächlich nur als Nullpointer - kommuniziert man damit eine Absicht, was bei 0 schlicht nicht möglich ist. Das Problem, dass diese Absicht durch den Compiler nicht strikt durchgesetzt werden kann, spricht nicht unbedingt dagegen, denn die kritischen Stellen, die dabei gerne angeführt werden, sind ja solche, bei denen weder 0 noch NULL (allein) verwendet werden dürfen, um den gewünschten Effekt zu erzielen.



  • Da ist was warhes dran :p
    ich glaube ich verwende doch lieber 0, wenn das sogar in Bjarne Stroustrups Buch steht 😃
    Gruß


  • Administrator

    LukasBanana schrieb:

    ich glaube ich verwende doch lieber 0, wenn das sogar in Bjarne Stroustrups Buch steht 😃

    Und wieso nicht die vorgeschlagenen "nullptr" Klasse?
    Ich habe soeben umgestellt und bin absolut zufrieden, zudem kann ich mich gleich an den neuen Standard gewöhnen und habe damit sogar geschafft den Compiler des MSVC2005 abstürzen zu lassen. Man kann den Fehler aber umgehen 🙂

    Grüssli



  • @ Dravere
    Also ich hab mir deine hier gepostete Klasse mal angeguckt und finde sie gut, jedoch hab ich folgendes Problem:

    // win32:
    
    HANDLE handle = nullptr; // Kein Problem
    
    if (handle != nullptr) // Error
    {
        CloseHandle (handle);
        handle = nullptr;
    }
    

    Ich bekomme folgende Fehlermeldung:
    error: no match for 'operator!=' in 'handle != nullptr'

    Wie kann man die Operatoren noch am elegantesten hinzufügen?

    Danke euch vielmals und viele liebe Grüße



  • Mit einer globalen Operatorüberladung sollte das gehen. Allerdings müsste die Klasse dann einen Namen haben (ich hab mal nullptr_t gewählt), ist vielleicht blöd weil man dann Instanzen bilden kann...

    Wahrscheinlich gibts eine bessere Lösung, hier trotzdem mal der Operator, bei dem du dann intern auf NULL überprüfen kannst:

    bool operator !=(HANDLE h, nullptr_t n);
    bool operator !=(nullptr_t n, HANDLE h);
    

  • Administrator

    C++'ler schrieb:

    @ Dravere
    Also ich hab mir deine hier gepostete Klasse mal angeguckt und finde sie gut, jedoch hab ich folgendes Problem:

    Ist nicht meine Klasse, ich fand sie nur extrem gut.

    Und dein Problem kann ich mit meinem Compiler nicht nachvollziehen. Es funktioniert bei mir perfekt.
    Bei mir gab es nur Probleme mit den Boost.SharedPtr, da reichte es die Sache umzudrehen:

    // Aus:
    if(x != nullptr)
    
    // Wird:
    if(nullptr != x)
    

    Welchen Compiler benutzt du denn?

    Grüssli



  • @ Dravere
    Den zu Letzt erschienenden DevC++ von Bloodsheed.

    Viele liebe Grüße


  • Administrator

    C++'ler schrieb:

    @ Dravere
    Den zu Letzt erschienenden DevC++ von Bloodsheed.

    Viele liebe Grüße

    Wieso verwenden immer so viele den DevC++?
    DevC++ wird nicht mehr weiterentwickelt und gilt als deprecated. Hol dir lieber Code::Blocks oder VS 2008 Express Edition. Würde mich nicht erstaunen, wenn es daran liegen könnte.

    Grüssli



  • Dravere schrieb:

    Wieso verwenden immer so viele den DevC++?

    Das wird wohl daran liegen, dass diese IDE vor allem für den Anfang einfach zu handhaben ist. Ich hab anfangs auch mit Dev-C++ gearbeitet. Man hat z.B. auch den Vorteil, nicht für jede kleine Datei gleich ein neues Projekt anzulegen.

    Als Anfänger sagen einem natürlich IntelliSense, Debugger und moderne Projektverwaltung auch nicht besonders viel. Doch es hilft einem wirklich enorm, deshalb kann ich Dravere nur beipflichten. Code::Blocks kenn ich jetzt nicht, aber VS lohnt sich auf jeden Fall.



  • Wieso verwenden immer so viele den DevC++?

    Genau aus dem gleichen Grund, warum einige noch C mit Klassen programmieren. 😉



  • Bulli schrieb:

    Genau aus dem gleichen Grund, warum einige noch C mit Klassen programmieren. 😉

    ja, weil es c++ erlaubt. etwas schlimmes it dennoch nicht daran.



  • nochmal zu 0 vs NULL...ich meine gelesen zu haben dass der präprozessor eigetnlch nur noch für die c jünger in c++ vorhanden ist...und eigentlich nicht mehr wirklcih verwendet werden sollte.. wäre damit dann NULL nicht schon ausgeschlossen?
    das mit foo(int) und foo(void*) ist ein schönes beispiel aber is das nicht irgendwie theoretisch? spricht das nicht villeicht für nen design fehler? und wenn mans doch so machen will warum sollte man der foo(void*) funktion ausgerechnet nen 0-pointer direkt übergeben?? ich behaupte mal die funktion kann damit nicht wirklich was anfangen 🙂 und wenn man variablen übergibt dann isses doch eindeutig welche funktion aufgerufen wird da die variable ja dann entweder vom typ int oder ein pointer ist bzw sein sollte 🙂 fragen über fragen 🙂 ich benutze seit langem nur 0 und nie NULL und hatte damit noch nie probleme 🙂 das musste einfach mal gesagt werden....



  • ich meine gelesen zu haben dass der präprozessor eigetnlch nur noch für die c jünger in c++ vorhanden ist...und eigentlich nicht mehr wirklcih verwendet werden sollte.

    Das ist Mist. 😉
    Der Präprozessor ist eine nützliche Sache richtig eingesetzt. Und das gilt auch für (fast) alle Sprachmittel, dass sie schon ihre Berechtigung haben und richtig eingesetzt sind sie Gold Wert.

    Das andere muss nicht soo theoretisch sein. Das kann (ok vlt. Designfehler) vorkommen, wenn man zum Beispiel ein riesiges Projekt hat, wo sehr viele Leute dran arbeiten und nicht alle über alles genau Bescheid wissen. Man sollte sich nicht zu fest auf den Programmierer verlassen, den der programmiert auch, wenn er Müde ist und wenn der Compiler ihm keine Fehlermeldung an den Kopf schmeisst, dann passiert genau so Zeugs.



  • nichts gegen den präprozessor der hat schon seine vorteile...den verwende ich auch hin und wieder aber nicht um "konstanten" zu definieren...

    ja das kann passieren da muss ich dir recht geben aber was ich meine: foo(int) und foo(void*) macht doch nur probleme wenn man das mit foo(0) aufruft oder? und warum sollte man ner funktion nen 0-pointer übergeben? damit wäre es ja garnicht schlimm wenn die foo(int) funktion aufgerufen wird, da foo(void*) vermutlich sowieso nichts sinnvolles machen könnte oder hab ich was übersehen?



  • drakon schrieb:

    Der Präprozessor ist eine nützliche Sache richtig eingesetzt. Und das gilt auch für (fast) alle Sprachmittel, dass sie schon ihre Berechtigung haben und richtig eingesetzt sind sie Gold Wert.

    Naja, wenn man gewisse Dinge betrachtet, die nur aus Kompatibilität zu C krampfhaft erhalten wurden, fragt man sich von Zeit zu Zeit schon wieder... Oder nur schon die Schlüsselwörter register , auto und goto werden in sauberem Code kaum jemals eingesetzt... Aber du hast ja zum Glück "fast" geschrieben 😉

    Ich hab dazu ein passendes Zitat:

    Dirk Louis schrieb:

    Die Geschichte des PC ist nicht nur eine Geschichte des Fortschritts, es ist auch eine Geschichte von beispielloser Rückwärtsgewandtheit - in Fachkreisen "Abwärtskompatibilität" genannt.



  • Naja, wenn man gewisse Dinge betrachtet, die nur aus Kompatibilität zu C krampfhaft erhalten wurden, fragt man sich von Zeit zu Zeit schon wieder... Oder nur schon die Schlüsselwörter register, auto und goto werden in sauberem Code kaum jemals eingesetzt... Aber du hast ja zum Glück "fast" geschrieben

    Naja. Was sollen die machen? - Die Mittel einfach verbieten und plötzlich sind Millionen von Zeilen Code ungültig? Denen ist das alles schon bewusst, aber darum wird einfach von gewissen Sprachmitteln abgesagt, aber verbieten können sie es nicht. register und auto sind einfach mittlerweile überflüssig geworden, aber keineswegs unnütz. Und goto. Naja. Das ist ja der berühmte Streifall. Ich sage dazu nur so viel, dass ich es bis jetzt ein einziges mal "wirklich" gebraucht habe. Zugegeben war es da einfach so,dass ich schnell was funktionierendes haben wollte und da hat sich hald goto gerade perfekt angeboten. 🙂


Anmelden zum Antworten