#define NULL NULL
#ifndef NULL
#define NULL NULL
#endif
Dieser code kompiliert mit gcc keine Warnungen/Fehler. Kann mir jemand erklären, was der Präprozessor ist hier?
- NULL bedeutet nicht undefiniert in C/C++ ...
- Dies ist wahrscheinlich beats #define SIXTY_NINE 69. bugpwr.blogspot.com/2007/07/magic-numbers-in-code.html
- versuchen zu tun ist: #ifndef NULL #define NULL 0 #endif
- Ich würde dies nie tun, in der Produktion code. Ich habe gerade gesehen irgendwo und dachte, es war interessant und Wert, darüber nachzudenken.
- eigentlich sah ich es auch irgendwo... ich würde nicht verwenden Sie es als Letzte Lösung. Es wird gesagt, dass am Anfang von C++ NULL definiert wurde, als eine null.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überall dort, wo der compiler sieht den text "NULL" es wird ersetzen Sie es mit dem text "NULL". Es ist wie eine Suche-und-ersetzen Sie in Ihrem code für "NULL" und ersetzen mit "NULL". Nicht illegal, nur komisch 🙂
Der einzig mögliche Grund dafür wäre, es zu tun vor einschließlich der header-Dateien, die selbst etwas tun, wie
Diese würde dann halt die NULL wird definiert, wie die.
const int NULL = 0;
Es ist normal:
Dieser kompiliert auch. Dies ist, weil der Präprozessor macht einfach geistlose ersetzt. Was es ersetzt und was es ersetzt mit nicht brauchen, um gültige Bezeichner.
Betrachten Sie es wie folgt: öffnen Sie im editor die Suchen & Ersetzen-Fenster und geben Sie "NULL" in beiden
Replace
undReplace with
Felder. Wird es nicht geben, keine Fehler-oder Warnmeldung und es "funktioniert", obwohl es eigentlich nicht tun. Der Präprozessor macht das gleiche.Natürlich, wenn Sie versuchen, es zu verwenden:
Ich habe gesehen, Fälle, in denen code wie diesem bringt einen Wert aus der compiler-Namensraum ("namespace" im Allgemeinen nicht C++
namespace
) an den Präprozessor namespace z.B.:Wirklich hässliche Sachen.
Ich persönlich habe nicht gefunden, eine Verwendung für diese Art der Sache, aber Sie existiert dennoch.
BEARBEITEN: ich habe gesehen, ich weiß nicht, warum es sinnvoll wäre, andere, als prüfen Sie, ob "
FOO
", definiert als ein Präprozessor-symbol irgendwo anders im code, die vielleicht im Umgang mit einigen legacy-code. Wer?static int const FOO = 1234;
. Ich habe keine Ahnung, warum Sie bereit wären, zu tragen, die auf unter diesen Bedingungen.#define FOO FOO
möglicherweise Sinn macht, wie Sie sagen, wenn Sie ersetzen ein makro mit einer Konstanten, aber nicht ändern möchten, einige alte code, der prüft, für die es definiert. Aber lassen FOO definiert werden, um etwas anderes, wenn man die Definition gibt die Konstante FOO klingt nach ärger für mich.Deutlich wird dieser nicht verwendet, da ein makro verwendet wird als eine Zusammenstellung Flagge. Gibt es andere Bereiche des Codes, in dem Sie sehen
#ifdef NULL
oder#ifndef NULL
?Es ist sehr merkwürdig zu verwenden, "NULL", die speziell als solche gekennzeichnet, aber ich habe gesehen, stranger (
#define TRUE FALSE
)...In der Antwort auf die Frage, was der Präprozessor macht:
Sei denn, es gibt vorhergehenden code undefs NULL, es ist das überspringen der
#define NULL NULL
komplett. NULL ist fast schon sicher definiert. In C++, die Verwendung von 0 ist, bevorzugt durch C++'s strengere Typüberprüfung. Wenn Sie müssen, verwenden Sie NULL, ist es am besten zu erklärenconst int NULL = 0;
(siehe Abschnitt 5.1.1 Stroustrup).nicht, dass definieren Sie einfach NULL als Zeichenfolge "NULL" ?
#define NULL "NULL"
"NULL"
.