#define NULL NULL

8
%Vor%

Dieser Code wird in gcc ohne Warnungen / Fehler kompiliert. Kann jemand erklären, was der Präprozessor hier macht?

    
J. Polfer 22.12.2009, 22:38
quelle

7 Antworten

19

Überall, wo der Compiler den Text "NULL" sieht, wird er durch den Text "NULL" ersetzt. Es ist wie ein Suchen und Ersetzen in Ihrem Code für "NULL" und Ersetzen durch "NULL". Nicht illegal, nur komisch:)

    
Doug T. 22.12.2009, 22:41
quelle
14

Der einzige mögliche Grund dafür wäre, vor zu machen, einschließlich Header-Dateien, die selbst so etwas wie

machen %Vor%

Dies würde dann verhindern, dass NULL so definiert wird.

    
Artelius 22.12.2009 22:45
quelle
5

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%     
Andreas Bonini 22.12.2009 22:40
quelle
3

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:

%Vor%

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?

    
Void 22.12.2009 23:02
quelle
2

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 ) ...

    
Aaronaught 22.12.2009 22:44
quelle
1

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).

    
Adam 22.12.2009 22:55
quelle
0

definiert das nicht einfach NULL als die Zeichenfolge "NULL"?

    
anon 22.12.2009 22:41
quelle

Tags und Links