Es ist normal:
%Vor%Dies kompiliert auch. Dies liegt daran, dass der Präprozessor einfach sinnlos ersetzt. Was es ersetzt und womit es ersetzt wird, muss kein gültiger Bezeichner sein.
Denken Sie daran: Öffnen Sie die Suche Ihres Editors & amp; Ersetzen Sie das Fenster und geben Sie "NULL" in die Felder Replace
und Replace with
ein. Es wird keinen Fehler oder eine Warnung geben und es wird "funktionieren", obwohl es tatsächlich nichts bewirkt. Der Präprozessor macht dasselbe.
Offensichtlich, wenn Sie versuchen, es zu benutzen:
%Vor% Ich habe Fälle gesehen, in denen Code wie dieser einen Wert aus dem Compiler-Namespace ("Namespace" im Allgemeinen, nicht C ++ namespace
) in den Präprozessor-Namespace, z. B. , bringt:
Wirklich hässliches Zeug.
Ich persönlich habe keinen Nutzen für diese Art von Dingen gefunden, aber existiert trotzdem.
BEARBEITEN : Während ich das gesehen habe, weiß ich nicht, warum es nützlich wäre, außer zu überprüfen, ob " FOO
" irgendwo anders im Code als Präprozessorsymbol definiert ist; vielleicht im Umgang mit Legacy-Code. Jeder?
Dies wird eindeutig nicht als Makro verwendet, sondern als Kompilierungsflag. Gibt es andere Bereiche des Codes, in denen #ifdef NULL
oder #ifndef NULL
angezeigt wird?
Es ist sehr seltsam, "NULL" zu verwenden, speziell als eine solche Flagge, aber ich habe Fremde gesehen ( #define TRUE FALSE
) ...
Als Antwort auf die Frage, was der Präprozessor macht:
Es sei denn, es gibt einen vorhergehenden Code, der NULL undefs enthält, wird der #define NULL NULL
vollständig übersprungen. NULL ist fast sicher schon definiert. In C ++ wird die Verwendung von 0 aufgrund der strengeren Typprüfung von C ++ bevorzugt. Wenn Sie NULL verwenden müssen, empfiehlt es sich, const int NULL = 0;
zu deklarieren (siehe Abschnitt 5.1.1 von Stroustrup).