Kann mit 0L initialisiert einen Zeiger in C++ zu Problemen führen?
In diese Frage ein Initialisierer wird verwendet, um einen Zeiger auf null. Anstelle der Verwendung von Wert 0
Wert von 0L
verwendet wird. Ich habe gelesen, dass sollte man sich genau 0
für null-Zeiger, weil genaue null-Zeiger-Darstellung ist die Umsetzung-spezifisch.
Kann mit 0L
um einen Zeiger auf null verursachen Probleme beim portieren?
InformationsquelleAutor sharptooth | 2009-12-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom standard (4.10.1):
also ich denke
0L
ist ok.InformationsquelleAutor Andreas Brinck
Ich denke
0L
ist in Ordnung, außer der Tatsache, dass es würde bedeuten, dass Sie glauben, dass die Zeiger geben Sie Ihre Zuweisung an die gleiche Größe wie eine lange, und so ist ein bisschen verwirrend.Ich denke, mit
NULL
ist viel klarer.0xDEADBEEF ist es besonders schlimm. 0 ist der einzige Wert ist, können Sie immer einen Zeiger (null-Zeiger), und es spielt keine Rolle, welche Größe der Zeiger.
NULL ist legal und Redewendungen. 0 ist legal und Redewendungen. 0L ist legal, aber nicht idiomatisch. 0xDEADBEEF ist entweder nicht spezifiziert oder nicht definiert ist, und sicherlich nicht ein null-Zeiger-Konstante. Ich freue mich auf
nullptr
mich.Sieben Zeichen für etwas, das im Grunde eine 0 ist ein bisschen viel verlangt, denke ich. Ich kann mir nicht denken, warum so viel Ausführlichkeit erforderlich ist, als wir haben NULL bereits. Vielleicht hat es einige spezielle Verwendungen in der neuen Norm, aber ich habe nicht wirklich sah Sie an.
Überlast Auflösung. Angesichts
f(int)
undf(int*)
,f(NULL)
Anrufef(int)
aberf(nullptr)
Anrufef(int*)
.InformationsquelleAutor KernelJ
In C++0x gibt es eine neue null-Zeiger-Konstante genannt
nullptr
Typnullptr_t
. Es kann implizit in jedem Zeiger-Typ.Erst dann würde ich empfehlen die Verwendung von NULL jedoch 0L 0 und beide arbeiten auf jede Implementierung, die ich je gehört habe.
definiert als 0, noch habe ich eine Vorliebe zu NULL, wie ich persönlich denke, es sieht sauberer aus.
InformationsquelleAutor Brian R. Bondy
Kann ich nicht geben Ihnen eine genaue Antwort, aber unabhängig davon, was die exakte Antwort auf Ihre Frage ist einfach die Idee selbst initialisieren Sie einen Zeiger mit
0L
ist falsch, weil es suggeriert, dass ein Zeiger die gleiche Größe wie einlong
, das ist nicht unbedingt wahr, natürlich.Ob der compiler akzeptiert es oder nicht, und ob es sicher ist oder nicht, würde ich es nicht tun, weil es suggeriert eine ungültige Idee.
Nein, weil 0 bedeutet nicht eine int.
Auch wenn es tut, es ist weniger schlimm als es ausdrücklich zu sagen
0L
, weil dieL
stark darauf hin, dass es soll verstanden werden, als einlong
. Nur0
nicht unbedingt von selbst implizieren, dass es einint
.Ich denke, die Tatsache, dass Sie ausdrücklich sagen, der Wert ist ein long ist hier das problem.
Ja, das ist genau das, was ich meine.
InformationsquelleAutor Jesper
Den null-Zeiger-Darstellung ist die Umsetzung spezifischer, aber weder 0 noch 0L ist unbedingt, dass die Umsetzung - Sie sind nur Wege, die der Benutzer festlegen kann, der null-Zeiger ist, und entweder ist OK.
Sollte ich darauf hinweisen, dass Bjarne Stroustrup hat einige Male angedeutet, dass seine Einstellung ist zu verwenden, Ebene 0 (und nicht NULL).
InformationsquelleAutor
Ich würde nicht einverstanden mit denen, die empfehlen, mit NULL, wenn eine der drei genannten Optionen würde tatsächlich funktionieren. In idiomatischen C++, der standard ist 0 (vielleicht weil Stroustrup ' s Vorlieben: http://www2.research.att.com/~bs/bs_faq2.html#null).
0L wird implizit umgewandelt werden, um die entsprechenden pointer-Typ in der gleichen Weise wie die 0 würde; es sieht nur ein bisschen seltsam und nicht wirklich sehr viel Sinn für die Grund Jesper gab..
Hinweis: Stroustrup empfiehlt die Verwendung von nullptr, wenn dies möglich ist, so ist er nicht zu empfehlen 0 so viel, wie die Empfehlung gegen die Verwendung von einem makro.
InformationsquelleAutor Nye
Können Sie verwenden
false
,0
,0l
,0L
,0ul
,0u
,00
, oder eine beliebige Anzahl von Möglichkeiten, um zu repräsentieren das literal null. Das literal null ist im Grunde ein Magisches symbol, das passiert auch entsprechen einer null-Zeiger-Konstante.Wenn, wir reden hier über einen Wert, der zufällig bitweise null, und der code wurden memcpy-ing es über den Zeiger, dann hätten wir die oben genannten Probleme.
Bonus-Frage: Welche Arten haben eine null-Zeiger-Konstante, die nicht bitweise null?
InformationsquelleAutor MSN
Müsste ich Stimme mit allen, dass gesagt NULL. Für diejenigen, die lieber mit 0, meine Meinung ist, dass Ihr code sollte sagen, was es bedeutet. Das Ergebnis, die Sie wollen, ist ein null-Zeiger ist, so sollte Ihr code sagen. Es macht sogar mehr Sinn, wenn man einen Vergleich:
ist viel klarer als
if (!some_variable) { }
InformationsquelleAutor Nathan Parrish
Zuweisung von 0L, long integer (64-bit) auf einem 32-bit-Zeiger unter Umständen zu Problemen führen. Wie im anderen post erwähnt, mit NULL initializse Zeiger auf null.
Der Wert 0 umgewandelt werden kann, um jede mögliche Größe von integer von der anderen.
Sie sind nicht die Zuordnung "long integer", aber "die null-Zeiger-Konstante". Und das ist garantiert zu arbeiten, unabhängig von der bit Breite ganze zahlen oder Zeiger.
Sie sind alle Recht, meine überlegung war, dass die Zuordnung von 64-bit-Integer, um einen 32-bit-Zeiger, wäre unwirksam. aber wie Sie bereits erwähnt der compiler konvertiert die Konstante zu den benötigten Typ um.
InformationsquelleAutor Holger Kretzschmar