Sollte man in C++ 'NULL' oder '0' für Pointer-initialisierungen nehmen?
-
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 anfangenund 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
undgoto
werden in sauberem Code kaum jemals eingesetzt... Aber du hast ja zum Glück "fast" geschriebenIch 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.
-
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.
-
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 dasauto
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?
-
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.
-
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 ihrGrü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
ohneauto
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 sehenAber 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++!