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



  • Ich erwarte keineswegs, dass diese Schlüsselwörter abgeschafft werden. In C++ etwas abzuschaffen kann man sowieso gleich vergessen. Vielleicht wird das der Sprache eines Tages zum Verhängnis werden... 😉

    Nein, ich bin mir der Konsequenzen eines "Verbots" von Sprachmitteln schon bewusst. Ich bin nur der Meinung, es gäbe sehr viele Dinge, die entweder niemand braucht oder die sehr unsauber bzw. mühsam sind. Aber mich stört es eigentlich nicht gross, ich kann ja die Dinge nutzen, die ich benötige. 🙂


  • Administrator

    ratlosigkeit schrieb:

    und warum sollte man ner funktion nen 0-pointer übergeben?

    Ist die Frage wirklich ernst gemeint?
    Damit kann man eine Option anbringen, ähnlich wie ein true/false, nur dass man es über ein Objektzeiger löst. Bei true ist es nicht nur ein true, sondern man hat gleich noch ein gültiges Objekt dazu. Zum Beispiel könnte man ein Objekt mitgeben, welches mitloggen soll, falls null übergeben wurde, so soll nichts passieren.

    Im übrigen lohnt es sich an nullptr zu gewöhnen, wie schon erwähnt wurde, wird nullptr im nächsten C++ Standard enthalten sein, dort dann allerdings als Schlüsselwort.

    Klar ist der Fall sehr theoretisch und man kann ihn oft sehr einfach umgehen, trotzdem ist es eine unnötige Einschränkung, welche eigentlich auch aufzeigt, dass etwas fehlt, nämlich das Nullelement des Zeigers.

    #define NULL 0 ist übrigens noch weit verbreitet, da die WinAPI und MFC dies so verwendet. Sicherlich nicht gerade schön, aber naja ...

    Grüssli



  • Nexus schrieb:

    Ich erwarte keineswegs, dass diese Schlüsselwörter abgeschafft werden. In C++ etwas abzuschaffen kann man sowieso gleich vergessen.

    Gerade zu einer neuen C++-Version fände ich einen kleinen "Cut" ganz gut. Ein paar alte Sachen rauswerfen, ein paar neue kommen ja auch rein, die Compiler könnten ja per switch nach verschiedenen Versionen kompilieren, dann muss auch kein Code weggeworfen werden. Würde C++ imho ganz gut tun, gerade auch Kleinigkeiten wie die Semikola nach Klassen-Deklarationen nerven mich einfach nur und scheinen so unnütz.



  • Badestrand schrieb:

    Nexus schrieb:

    Ich erwarte keineswegs, dass diese Schlüsselwörter abgeschafft werden. In C++ etwas abzuschaffen kann man sowieso gleich vergessen.

    Gerade zu einer neuen C++-Version fände ich einen kleinen "Cut" ganz gut. Ein paar alte Sachen rauswerfen, ein paar neue kommen ja auch rein, die Compiler könnten ja per switch nach verschiedenen Versionen kompilieren, dann muss auch kein Code weggeworfen werden.

    Ja, einige Sachen sind unschön. Mir gefallen aber auch einige Teile der neuen Syntax nicht sehr (z.B. die Initialisierung mit {}, auto-Funktionen mit ->). Ich hab das Gefühl, C++ wird immer schwieriger, komplexer und abstrakter, gleichzeitig wird viel alter, unnötiger Ballast jahrelang mitgeschleppt. Auf Dauer kann so etwas nicht gut gehen. Und gerade Dinge wie decltype werden wohl nicht zu saubererem Code führen. Auch das auto bei Deklarationen ist wahrscheinlich nicht gerade hilfreich für den Programmierstil. Nett ist auch, dass die sonst schon nicht gerade trivialen Operatoren und Schlüsselwörter jetzt noch mehr Bedeutungen erlangen (z.B. operator-> , auto , default , using , delete ). Klar, ich finde auch, es gibt gute Neuerungen in C++0x, aber so wirklich überzeugt bin ich nicht.

    Badestrand schrieb:

    Würde C++ imho ganz gut tun, gerade auch Kleinigkeiten wie die Semikola nach Klassen-Deklarationen nerven mich einfach nur und scheinen so unnütz.

    Ja, aber das Semikolon hat dort schon einen Sinn, die Klasse stellt schliesslich einen abgeschlossenen Typen dar... Sonst müsste man bei Enums, Unions und Array-Initialisierungslisten auch das Semikolon weglassen. Und ausserdem hat das ; den Sinn, dass man auch schreiben kann:

    class MyClass
    {
       // ...
    } Instance;
    


  • Nexus schrieb:

    Ja, aber das Semikolon hat dort schon einen Sinn, die Klasse stellt schliesslich einen abgeschlossenen Typen dar... Sonst müsste man bei Enums, Unions und Array-Initialisierungslisten auch das Semikolon weglassen. Und ausserdem hat das ; den Sinn, dass man auch schreiben kann:

    class MyClass
    {
       // ...
    } Instance;
    

    Ich finde diese Variablen-Deklarations-Möglichkeit direkt hinter Enum/Union/Struct/Klasse doof, einmal weil ich es nie brauche und andererseits, weil es meiner Intuition entgegen läuft. Ich meine, es steckt schon Logik dahinter, aber hinter Blöcken setze ich ungern Semikola; und eine Klassen-Deklaration ist für mich irgendwo ein Block, anders als z.B. eine Array-Initialisierungsliste.
    Apropos Arrays: Die sollten dann auch gleich renoviert werden 😃



  • Nexus schrieb:

    Auch das auto bei Deklarationen ist wahrscheinlich nicht gerade hilfreich für den Programmierstil.

    Wenn du schonmal in Sprachen mit Type Inference programmiert hast, wirst du es zu schaetzen wissen. Der Typ von Objekten ist total egal, und gerade bei verschachtelten Templates oder Funktionszeiger, da will ich den Typ ja nicht mal sehen, weil ich sonst gehirnkrebs bekomme.

    Ne ne, C++ geht in die richtige Richtung. Type Inference und lambda Funktionen, das ermoeglicht viel schoeneren Code.

    das einzige keywords dass wirklich unnuetz ist, ist register.
    und kompliziert? imho wird mehr vereinfacht als verkompliziert 🙂



  • Die richtige Antwort lautet 0 (int) für C++, NULL (void* 0) für C und NULL in C++, wenn man mit C-Bibliotheken arbeitet.

    Wieso braucht ihr da 5 Seiten, um nichts zu sagen?


  • Mod

    Die Antwort schrieb:

    Die richtige Antwort lautet 0 (int) für C++, NULL (void* 0) für C und NULL in C++, wenn man mit C-Bibliotheken arbeitet.

    Wieso braucht ihr da 5 Seiten, um nichts zu sagen?

    Unfug.



  • camper schrieb:

    Die Antwort schrieb:

    Die richtige Antwort lautet 0 (int) für C++, NULL (void* 0) für C und NULL in C++, wenn man mit C-Bibliotheken arbeitet.

    Wieso braucht ihr da 5 Seiten, um nichts zu sagen?

    Unfug.

    Unfug.


  • Administrator

    Nexus schrieb:

    Auch das auto bei Deklarationen ist wahrscheinlich nicht gerade hilfreich für den Programmierstil.

    Kommt drauf an, wie man es einsetzt. Wie es Shade Of Mine gesagt hat, ist es in den templates extrem praktisch. Ich zeig dir mal ein Beispiel von mir:

    // Funktionshilfe (vielleicht mit C++0x auch nicht mehr nötig):
    template<typename TNode, typename TIter>
    util::CRangeIterator<TIter, CNodeTypeAcceptor<TNode> > create_node_type_iterator(TIter Start, TIter End)
    { return util::CRangeIterator<TIter, CNodeTypeAcceptor<TNode> >(Start, End); }
    
    // Typen:
    typedef /* ... */ t_NodeList;
    typedef /* ... */ t_Element;
    
    // Variablen:
    t_Nodelist const NodeList;
    
    // Verwendung aktuell:
    typedef util::CRangeIterator<t_NodeList::const_reverse_iterator, CNodeTypeAcceptor<t_Element> > t_Iter;
    
    t_Iter Iter = create_node_type_iterator<t_Element>(NodeList.rbegin(), NodeList.rend());
    
    // -> WARGH!
    
    // Verwendung mit C++0x:
    auto Iter = create_node_type_iterator<t_Element>(NodeList.rbegin(), NodeList.rend());
    
    // -> w00t!
    

    Ich bin vom neuen Standard begeistert. Er geht mir im Gegenteil teilweise noch nicht weit genug. C++ war noch nie eine Anfängersprache und sollte es auch nie werden, dafür sollte sie richtig gute Features für die Fortgeschrittenen bis Profis anbieten.
    Klar könnte man noch ein zwei Dinge vielleicht etwas besser machen, aber im gesamten bin ich wirklich begeistert.

    Badestrand schrieb:

    Ich finde diese Variablen-Deklarations-Möglichkeit direkt hinter Enum/Union/Struct/Klasse doof, einmal weil ich es nie brauche und andererseits, weil es meiner Intuition entgegen läuft.

    Ich finde das wahnsinnig praktisch. Das ist die Sprachliche Implementation eines Singletons. Man schaue sich zum Beispiel die Klasse von nullptr an, das ist doch genial. Wieso noch einen Namen für die Klasse verschwenden, wenn man sowieso nie mehr als eine Instanz haben wird.
    Widersetz dich nicht der Sprachsyntax, sondern werde eins mit ihr 😃

    Grüssli



  • Meine Skepsis gegenüber C++0x ist wahrscheinlich auch darauf zurückzuführen, dass ich nur hobbymässig programmiere und weder riesige Projekte noch so komplizierte und lange Bezeichner habe, dass ein typedef ohne auto unübersichtlich wird. Ich kann mir gut vorstellen, dass die neue Syntax gerade professionellen Anwendern sehr helfen kann, möglicherweise werde ich das später auch so sehen 😉

    Aber wie gesagt, momentan komme ich eigentlich gut mit der jetzigen Syntax zurecht, und es fehlen mir vielleicht die Anwendungsmöglichkeiten von C++0x (wobei ich einige Dinge auch sehr praktisch finde).



  • Widersetz dich nicht der Sprachsyntax, sondern werde eins mit ihr

    Komm auf die bös.. ähh gute Seite der Sprache Luke. 🙂

    Ansonsten denke ich auch, dass mit C++0x vor allem die forgeschrittenen Programmierer an die Reihe kommen. Und nicht direkt eine "vereinfachung" stattfindet. Die Syntax wird wahrscheinlich noch abschrekender, wenn man es nicht kennt. 😃
    Nach dem Vortrag von Stroustrup soll aber allgemein auch noch mehr Ausdruck in die Sprache kommen und das finde ich extrem postitiv, dass man sich dann sehr direkt ausdrucken kann.



  • Die Antwort schrieb:

    Die richtige Antwort lautet 0 (int) für C++, NULL (void* 0) für C und NULL in C++, wenn man mit C-Bibliotheken arbeitet.

    Wieso braucht ihr da 5 Seiten, um nichts zu sagen?

    Ich sehe, du hast mein Buch gelesen! Wenigstens einer in diesem Forum, der Ahnung hat! Von dir kann auch camper noch was lernen! 👍



  • Bjarne Stroustrup schrieb:

    Die Antwort schrieb:

    Die richtige Antwort lautet 0 (int) für C++, NULL (void* 0) für C und NULL in C++, wenn man mit C-Bibliotheken arbeitet.

    Wieso braucht ihr da 5 Seiten, um nichts zu sagen?

    Ich sehe, du hast mein Buch gelesen! Wenigstens einer in diesem Forum, der Ahnung hat! Von dir kann auch camper noch was lernen! 👍

    Nur komisch, dass er eplizit zu 0 rät. (TC++PL, 4. Auflage, Seite 96, 5.1.1)



  • Hat er doch gesagt, 0 für C++!



  • keine Magicnumbers dafür im Code verteilen, sonder Konstanten oder Defines, dann kann mans auch schnell ändern, wenn 0x0000 doch besser ist als 0x0



  • 0 ist keine Magic Number, sondern eine Rahmenvereinbarung!



  • das 0 wiel jede Zahl im Code eine Magicnumber ist, ist ja wohl klar. Irgend einer kommt irgendwann mal auf dei idee sowas zu machen

    pos = 0;
    
    if (...)
      pos = 0;
    
    ...
    
    pos = 0;
    

    Ach pos sollte da doch besser immer 7 sein, kein Problem Suchen & Ersetzen, ups alle null pointer geändert.



  • Dafür gibt es z.B. die ungarische Notation. 0 ist bei Zeigern weiterhin keine Magic Number.



  • jetzt hör mal zu, alter schrieb:

    Dafür gibt es z.B. die ungarische Notation. 0

    😃 👍 Du bist lustig


Anmelden zum Antworten