Pointer != NULL : C ? C++



  • Warum haben sie's eigentlich NULL und nicht ZERO genannt?!



  • Um von "zero" zu unterscheiden. Zero bezeichnet die Zahl 0, null heißt so viel wie "nichtig" oder "nicht-existent".



  • Vielleicht haben sie sich auch von Lisp inspirieren lassen ... null? bzw. die leere Liste '(). Alternative in anderen Sprachen ist nil.



  • 314159265358979 schrieb:

    NULL ist C-Style. In C++ verwendet man 0, bzw nullptr in C++0x, wobei ich das != 0/nullptr ganz weglassen würde.

    Ich verwende in C++ NULL (oder das selbstgebastelte nullptr -Template). Der Code ist klarer als mit 0 , zudem kann man später leichter durch den sicheren C++0x- nullptr ersetzen.


  • Mod

    Ich habe gerade noch mal im Standard gestöbert: NULL ist in C++ garantiert 0 (4.10), in C ist es implementation defined (7.17). Das ändert aber auch nichts an den Antworten in diesem Thread, es dient nur als Bestätigung. Man muss aber vermutlich sehr lange suchen, um eine C-Implementierung mit NULL!=0 zu finden 😉 .



  • ääähhh schrieb:

    314159265358979 schrieb:

    NULL ist C-Style. In C++ verwendet man 0

    In C++ ist NULL als 0 definiert.

    Was nichts an der Tatsache ändert, dass es unleserlich ist und deshalb nicht verwendet werden sollte.



  • 314159265358979 schrieb:

    ääähhh schrieb:

    In C++ ist NULL als 0 definiert.

    Was nichts an der Tatsache ändert, dass es unleserlich ist und deshalb nicht verwendet werden sollte.

    Warum genau ist NULL zur Kennzeichnung von Zeigern unleserlicher als das Integer-Literal 0 ?



  • Nexus schrieb:

    Warum genau ist NULL zur Kennzeichnung von Zeigern unleserlicher als das Integer-Literal 0 ?

    Ich benutze ausschließlich NULL bei Pointern und finde es wesentlich leserlicher, denn NULL signalisiert sofort, dass die Variable ein Pointer ist und es signalisiert sofort, dass der Pointer zum Nullzeiger wird.

    Andererseits ist in der Regel manuelle Ressourcenverwaltung sowieso bei mir ausgeschlossen, daher gibt es auch praktisch keine NULLs mehr.

    mfg, NRWsoft



  • In C ist NULL üblicherweise als ((void*) 0) o. vglb. definiert. In C++ ist diese Definition explizit ausgeschlossen (18.1 (4), Fußnote 180), weil das strengere Typsystem in C++ damit Dinge wie

    non_pod *ptr = NULL;
    

    nicht hergäbe. Explizit vorgeschlagen werden 0 und 0L als Alternativen, und meistens wird auch eine dieser beiden Varianten benutzt. Das Problem, dass sich daraus ergibt (und der Grund, warum NULL in C++ unpopulär ist, obwohl es eigentlich ziemlich gleichgültig ist, ob man NULL oder 0 schreibt), ist, dass NULL verwirrenderweise zwar eine "pointer constant", aber selbst kein Zeiger ist. Zum Beispiel wird

    #include <cstddef>
    #include <iostream>
    
    template<typename T> struct is_pointer_mp     { static bool const val = false; };
    template<typename T> struct is_pointer_mp<T*> { static bool const val = true ; };
    
    template<typename T> bool is_pointer(T) { return is_pointer_mp<T>::val; }
    
    int main() {
      std::cout << (is_pointer(NULL) ? "wahr" : "falsch") << std::endl;
    }
    

    "falsch" ausgeben. Gcc 4.5 warnt hier übrigens:

    test.cc: In Funktion »int main()«:
    test.cc:10:32: Warnung: Übergabe von NULL an Nicht-Zeiger-Argument 1 von »bool is_pointer(T) [with T = long int]«
    

    Schlussendlich kann man es so oder so machen; es ist Geschmackssache. Ein Unterschied in der Programmlogik ergibt sich daraus jedenfalls nicht.



  • Ja, man muss sich bewusst sein, dass NULL ein int und somit nicht typsicher ist. Typsicherheit erreicht man mit dieser Klasse, die aber wieder andere Probleme hat (v.a. im Bezug auf Memberfunktionszeiger).

    In C++0x wird die Problematik mit nullptr ja sauber gelöst.



  • seldon schrieb:

    In C ist NULL üblicherweise als ((void*) 0) o. vglb. definiert. In C++ ist diese Definition explizit ausgeschlossen (18.1 (4), Fußnote 180), weil das strengere Typsystem in C++ damit Dinge wie

    non_pod *ptr = NULL;
    

    nicht hergäbe. Explizit vorgeschlagen werden 0 und 0L als Alternativen, und meistens wird auch eine dieser beiden Varianten benutzt. Das Problem, dass sich daraus ergibt (und der Grund, warum NULL in C++ unpopulär ist, obwohl es eigentlich ziemlich gleichgültig ist, ob man NULL oder 0 schreibt), ist, dass NULL verwirrenderweise zwar eine "pointer constant", aber selbst kein Zeiger ist. Zum Beispiel wird

    #include <cstddef>
    #include <iostream>
    
    template<typename T> struct is_pointer_mp     { static bool const val = false; };
    template<typename T> struct is_pointer_mp<T*> { static bool const val = true ; };
    
    template<typename T> bool is_pointer(T) { return is_pointer_mp<T>::val; }
    
    int main() {
      std::cout << (is_pointer(NULL) ? "wahr" : "falsch") << std::endl;
    }
    

    "falsch" ausgeben.

    Aber 0 bringt da auch nix.



  • Das ist schon richtig, aber bei 0 erwartet auch niemand, dass es sich um einen Zeiger handelt.



  • seldon schrieb:

    Das ist schon richtig, aber bei 0 erwartet auch niemand, dass es sich um einen Zeiger handelt.

    Außer, wenn man 0 mit einem Zeiger vergleicht. 😃


  • Mod

    tja schrieb:

    seldon schrieb:

    Das ist schon richtig, aber bei 0 erwartet auch niemand, dass es sich um einen Zeiger handelt.

    Außer, wenn man 0 mit einem Zeiger vergleicht. 😃

    Deshalb schreibt man ja auch oft if (pointer) ... statt explizit zu vergleichen.

    Und so schließt sich der Kreis 😃 .



  • Ich mische NULL, 0 und nullptr wild durch, um zu zeigen, dass ich kapiert habe, dass es egal ist. Leserlichkeit finde ich bei allen drein gleich gut oder schlecht.



  • Eisflamme schrieb:

    Ich mische NULL, 0 und nullptr wild durch, um zu zeigen, dass ich kapiert habe, dass es egal ist. Leserlichkeit finde ich bei allen drein gleich gut oder schlecht.

    Der C++0x nullptr ist nicht das gleiche, denn er behebt ein paar praktische und konzeptionelle Bugs, die nur bei NULL und 0 auftreten!

    mfg, NRWsoft



  • Eisflamme schrieb:

    Ich mische NULL, 0 und nullptr wild durch, um zu zeigen, dass ich kapiert habe, dass es egal ist.

    [ ] Du erkennst den Sinn von Code Guidelines
    [ ] Du verstehst die Unterschiede zwischen den drei Varianten
    [ ] Du siehst die Unsinnigkeit des Vergleichs auf 0 in Bedinungen
    [ ] Du hast ein minimales Ästhetikbewusstsein
    [X] Du wühlst dich täglich durch grottenschlechten (=eigenen) Code



  • Ohh, man, ihr seid echt zuckersüß... 🙂
    Ihr diskutiert über mehrere Seiten, ob man in C++ "Pointer != NULL" schreibt. Sogar Assembler-Code wird zu Rate gezogen 😉
    Ich sage x, es ist Geschmackssache. Und auch wenn es weh tut, C++ ist nur ein besseres C (so sollte man es auch benutzen). 😉



  • Exhumed schrieb:

    Ich sage x, es ist Geschmackssache.

    Nein, nullptr ist die Zukunft. Sobald C++0x Standard ist, sollte man nicht mehr 0 oder NULL benutzen

    mfg, NRWsoft



  • NRWsoft schrieb:

    Nein, nullptr ist die Zukunft. Sobald C++0x Standard ist, sollte jeder gesteinigt werden, der noch 0 oder NULL benutzt.

    ...gut, damit kann ich mich anfreunden...ich meine mit dem gesteinigt werden... 🙂 nee, hast schon recht, das würde die Diskussion ad absurdum führen... 😉


Anmelden zum Antworten