Ich beginne damit: Konsistenz ist König, die Entscheidung ist weniger wichtig als die Konsistenz in Ihrer Codebasis.
In C ++
NULL ist in C ++ als 0 oder 0L definiert.
Wenn Sie die C ++ - Programmiersprache gelesen haben, schlägt Bjarne Stroustrup vor, 0
das NULL
Makro bei der Zuweisung explizit zu vermeiden. Ich bin mir nicht sicher, ob er dasselbe mit Vergleichen getan hat. Es ist eine Weile her, seit ich das Buch gelesen habe. Ich glaube, er hat es gerade getan if(some_ptr)
ohne expliziten Vergleich, aber ich bin mir nicht sicher.
Der Grund dafür ist, dass das NULL
Makro täuscht (wie fast alle Makros), es ist tatsächlich 0
wörtlich und kein eindeutiger Typ, wie der Name vermuten lässt. Das Vermeiden von Makros ist eine der allgemeinen Richtlinien in C ++. Auf der anderen Seite 0
sieht es aus wie eine Ganzzahl und ist es nicht, wenn es mit Zeigern verglichen oder diesen zugewiesen wird. Persönlich könnte ich in beide Richtungen gehen, aber normalerweise überspringe ich den expliziten Vergleich (obwohl einige Leute dies nicht mögen, was wahrscheinlich der Grund ist, warum Sie einen Mitwirkenden haben, der sowieso eine Änderung vorschlägt).
Unabhängig von persönlichen Gefühlen ist dies größtenteils eine Wahl des geringsten Übels, da es keine richtige Methode gibt.
Dies ist klar und eine gängige Redewendung, und ich bevorzuge es. Es besteht keine Möglichkeit, dass während des Vergleichs versehentlich ein Wert zugewiesen wird, und es lautet deutlich:
if(some_ptr){;}
Dies ist klar, wenn Sie wissen, dass some_ptr
es sich um einen Zeigertyp handelt, aber es kann auch wie ein ganzzahliger Vergleich aussehen:
if(some_ptr != 0){;}
Dies ist klar, in den meisten Fällen macht es Sinn ... Aber es ist eine undichte Abstraktion, NULL
ist tatsächlich 0
wörtlich und könnte leicht missbraucht werden:
if(some_ptr != NULL){;}
C ++ 0x hat nullptr, was jetzt die bevorzugte Methode ist, da es explizit und genau ist. Seien Sie nur vorsichtig bei versehentlicher Zuweisung:
if(some_ptr != nullptr){;}
Bis Sie in der Lage sind, auf C ++ 0x zu migrieren, ist es meiner Meinung nach Zeitverschwendung, sich Gedanken darüber zu machen, welche dieser Methoden Sie verwenden. Sie sind alle unzureichend, weshalb nullptr erfunden wurde (zusammen mit allgemeinen Programmierproblemen, die zu einer perfekten Weiterleitung führten .) Das Wichtigste ist die Aufrechterhaltung der Konsistenz.
In C.
C ist ein anderes Tier.
In C kann NULL als 0 oder als ((void *) 0) definiert werden, C99 ermöglicht die Implementierung definierter Nullzeigerkonstanten. Es kommt also tatsächlich auf die Definition von NULL durch die Implementierung an, und Sie müssen sie in Ihrer Standardbibliothek überprüfen.
Makros sind sehr verbreitet und werden im Allgemeinen häufig verwendet, um Mängel bei der allgemeinen Programmierunterstützung in der Sprache und anderen Dingen auszugleichen. Die Sprache ist viel einfacher und das Vertrauen in den Vorprozessor häufiger.
Aus dieser Perspektive würde ich wahrscheinlich empfehlen, die NULL
Makrodefinition in C zu verwenden.