Kleine Frage zu NULL und Stroustrup



  • Ich hab in die FAQ geschaut und das gefunden:

    http://www.c-plusplus.net/forum/viewtopic.php?t=39480

    Ich hab gerade keinen Stroustrup zur Hand, meinte er wirklich NULL in C++ sei unschön?

    **
    n C:
    #define NULL ((void*)0)

    In C++:
    #define NULL 0

    In stdlib.h:
    /* Define NULL pointer value */

    #ifndef NULL
    #ifdef __cplusplus
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    #endif
    **

    Ich glaub die Stelle "In C++: #define NULL 0" stimmt nicht, denn:

    Gerade eben war ich total verwirrt weil meine Anwendung ohne iostream nicht funktionieren wollte, obwohl ich damit nur Text ausgeben hatte. Das Visual Studio erkannte mit mal die " = NULL"-Zuweisungen nicht mehr. Nun hab ich im FAQbeitrag gelesen das in der stl NULL definiert wird als 0.

    Somit die Frage: Ist NULL überhaupt ein C++ Begriff?

    Nur was hat man davon wenn eh beides identisch ist?



  • wenn ich den faq beitrag richtig interpretiere:

    die lesbarkeit.

    ps: deinen fehler kann ich nicht nachvollziehen?
    pps: achso, du hast weder stdio, noch iostream drin, sondern keinen header...

    ansonsten: stl ist ebenso c++.



  • elise schrieb:

    wenn ich den faq beitrag richtig interpretiere:

    die lesbarkeit.

    ps: deinen fehler kann ich nicht nachvollziehen?
    pps: achso, du hast weder stdio, noch iostream drin, sondern keinen header...

    ansonsten: stl ist ebenso c++.

    Die stl gehört offiziell zu C++? Ich dachte die soll erst noch dazu kommen.
    Falls sie schon dazugehört verstehe ich wieso die Aussage

    **
    In C++:
    #define NULL 0**

    , ansonsten nicht weil NULL eben unbekannt ist 😃

    Imho ist NULL besser lesbar und bei Pointern einfach Pflicht, von daher würde ich mir eben auch ein Macro definieren. Nur was sagt Stroustrup?
    Und wieso ist unter C NULL = ((void *)0) ? ➡ ⚠



  • ?

    Naja, jedenfalls schreibt Stroustrup wirklich man soll 0 verwenden anstatt NULL.

    Ich verwende inzwischen nur noch 0x0....

    mfg, KdeE



  • C++ könnte IMHO ein "richtiges" NULL vertragen.
    Ich denk da nur an

    foo(int);
    foo(Blubb*);
    

    😉

    So wie es jetzt ist, ist NULL kaum sinnvoller als 0 oder sonstirgendwas. Daher finde ich die Diskussion grundsätzlich sinnlos.



  • Ein Pointer-NULL wie in C ist in C++ so ohne weiteres gar nicht möglich, weil C++ eine typsichere Sprache ist. Anschauungsbeispiel:

    $ cat t.cc
    struct A { };
    
    void foo(A *a) { }
    
    int main() {
      foo(static_cast<void*>(0));
    }
    $ g++ t.cc
    t.cc: In function `int main()':
    t.cc:6: error: invalid conversion from `void*' to `A*'
    


  • In C ist NULL ((void*)0), um zu vermeiden, dass jemand NULL als Ersatz für eine 0 nimmt, aber da in C++ void*-Pointer nicht mehr implizit in andere Pointer gecastet werden ist der Trick nicht mehr möglich.

    Und ja, die STL gehört natürlich zu C++. Du verwechselst die wohl mit boost.

    @Optimizer
    für C++0x gibt es da AFAIK einen Vorschlag



  • Deshalb ➡ C++ könnte ein "richtiges" Pointer-0 vertragen.

    EDIT:

    @Optimizer
    für C++0x gibt es da AFAIK einen Vorschlag

    Das ist natürlich heiß. 🙂



  • Yo, Bjarne schlägt tatsächlich vor 0 zu schreiben, anstatt NULL. An den Grund kann ich mich jedoch nicht mehr erinnern, müsste ich nochmal nachschlagen. Aber ich benutze selber NULL, andererseits schreibe ich immer ausversehen null, weil ich auf Arbeit täglich 8 Std. Java code.



  • Wenn ihr schon alle den anderen Beitrag gelesen habt, was ist denn bitteschön der Unterschied von
    0 , 0L , und 0LL
    ?????



  • Der Typ. 0 ist int, 0L ist long int, 0LL ist ein Syntaxfehler (oder long long int in C99).



  • @Optimizer: n1601.



  • Helium schrieb:

    @Optimizer: n1601.

    Ich wette mit dir, das Ding wird nicht nullptr heißen, sondern null_ptr. 😉



  • Optimizer schrieb:

    C++ könnte IMHO ein "richtiges" NULL vertragen.
    Ich denk da nur an

    foo(int);
    foo(Blubb*);
    

    Eigenartigerweise liefert mir der aktuelle MSC hier keinen Fehler und nimmt unaufgefordert foo(int). Ist das normal? Es ist zwar kein Problem, da ich eine Nullzeigerklasse verwende, die solche Überladungen auflösen kann, verwundern tut's mich trotzdem.



  • groovemaster schrieb:

    Eigenartigerweise liefert mir der aktuelle MSC hier keinen Fehler und nimmt unaufgefordert foo(int). Ist das normal?

    Ja, das ist normal, und das ist eigentlich der wichtigste Grund gegen NULL. Die Leute erwarten anscheinend, dass NULL sich wie ein Pointer verhält. Wenn man einfach 0 schreibt, liegen die Karten auf dem Tisch.



  • Denke mein Beitrag passt noch in dieses Topic rein.

    Ebenfalls aus dem Stroustrup:

    int* p = new int;
    	*p = 5;
    	long i1 = reinterpret_cast<long>(p)&0xFFFF0000;
    	long i2 = reinterpret_cast<long>(p)&0x0000FFFF;
    	p = 0;
    	// point #1: no pointer to the int exists here
    	p = reinterpret_cast<int*>(i1|i2) ;
    	// now the int is referenced again
    

    Ich frage mich wie er da die Adresse von p wieder herstellt? 😕



  • rewe schrieb:

    Denke mein Beitrag passt noch in dieses Topic rein.

    Ebenfalls aus dem Stroustrup:

    int* p = new int;
    	*p = 5;
    	long i1 = reinterpret_cast<long>(p)&0xFFFF0000;
    	long i2 = reinterpret_cast<long>(p)&0x0000FFFF;
    	p = 0;
    	// point #1: no pointer to the int exists here
    	p = reinterpret_cast<int*>(i1|i2) ;
    	// now the int is referenced again
    

    Ich frage mich wie er da die Adresse von p wieder herstellt? 😕

    Nehmen wir mal an die adresse von p wäre 0x12345678

    dann hat er long i1 den wert 0x12340000 zu gewiesen

    und long i2 den wert 0x00005678 ( oder kurz 0x5678)

    mit

    p = reinterpret_cast<int*>(i1|i2) ;
    

    hat er die adresse wieder zusammengesetzt und lässt nun p wieder auf die adresse zeigen.

    ->      i1    |      i2    =>     p
    -> 0x12340000 | 0x00005678 => 0x12345678
    

    MfG


Anmelden zum Antworten