Verzeihung, ich war verwirrt, als ich versuchte, mich zu erklären)))
Ein weiteres Mal:
Zum Zeitpunkt der zweiten VALUE-Definition ist das VALUE-Makro noch nicht definiert, so dass VALUE definiert ist als
denn TMP wurde und wird durch WERT definiert.
Aber TMP wird nach der zweiten VALUE-Definition erweitert zu
(Etwa so))
Der Präprozessor trägt nur ein, was er hat, und es spielt keine Rolle, wie und wo es definiert ist. Deshalb muss man damit vorsichtig sein. Beispiel:
und jetzt fügen wir der Funktion noch etwas Böses hinzu, nämlich einen Nebeneffekt
Und das ist nur eine Aufschrift, aber was ist, wenn die Einzahlung von dieser Funktion abhängt?
lustig), wenn Sie es bekommen)
#define VALUE 10#define TMP VALUE
#undef VALUE
Ich habe es richtig gemacht, nachdem ich die Ersetzung rückgängig gemacht habe, ist die erste Zeile nicht mehr 10 und die zweite TMP ist VALUE, aber nicht 10. D.h. die Substitution ist weit entfernt von einer Zuordnung.
Ich habe es richtig gemacht, nachdem ich die Ersetzung rückgängig gemacht habe, ist die erste Zeile nicht mehr 10 und die zweite TMP ist ein WERT, aber nicht 10. D.h. eine Substitution ist noch lange kein Auftrag.
Ja, eine Substitution ist genau eine Substitution, eins-zu-eins. Wenn jedoch das VALUE-Makro in Ihrem Code definiert ist (nicht zu verwechseln mit der Präprozessor-Direktive), erweitert der Präprozessor TMP->VALUE->10 und wenn nicht, TMP->VALUE. In diesem Fall sind die Präprozessor-Direktiven nicht in den Code selbst involviert, sie sind beim Kompilieren nicht mehr vorhanden. Beispiel:
#define VALUE 10#define TMP VALUE
voidOnStart()
{
Print(TMP); //10if (false){
#undef VALUE
#define VALUE 20Print(TMP);}
elsePrint(TMP); //20
}
Ja, Substitution ist genau Substitution, eins zu eins. Wenn das VALUE-Makro während der Substitution in Ihrem Code definiert ist (nicht zu verwechseln mit den Präprozessoranweisungen), expandiert der Präprozessor einfach TMP->VALUE->10, und wenn nicht, TMP->VALUE. In diesem Fall sind die Präprozessor-Direktiven nicht in den Code selbst involviert, sie sind beim Kompilieren nicht mehr vorhanden. Beispiel:
Ja, wenn Sie die zweite VALUE-Ersetzung 20 auskommentieren, wird die VALUE-Variablendeklaration verschwinden und der Compiler wird sie nicht sehen und schimpfen)
#define VALUE 10// VALUE = 10#define TMP VALUE // TMP = 10 VALUE
#undef VALUE // VALUE = EMPTY#define VALUE (TMP*2) // TMP = 10 EMPTY, следовательно VALUE = 20 EMPTY
Alles ist möglich, nur ein Makro muss hinzugefügt werden
Ergebnis: 20
Alles ist möglich, nur ein Makro muss hinzugefügt werden
Ergebnis: 20.
Das ist sehr gut. Ich bin nicht gut im Erraten von Rätseln.
Verzeihung, ich war verwirrt, als ich versuchte, mich zu erklären)))
Ein weiteres Mal:
Zum Zeitpunkt der zweiten VALUE-Definition ist das VALUE-Makro noch nicht definiert, so dass VALUE definiert ist als
denn TMP wurde und wird durch WERT definiert.
Aber TMP wird nach der zweiten VALUE-Definition erweitert zu
(Etwa so))
Der Präprozessor trägt nur ein, was er hat, und es spielt keine Rolle, wie und wo es definiert ist. Deshalb muss man damit vorsichtig sein. Beispiel:
und jetzt fügen wir der Funktion noch etwas Böses hinzu, nämlich einen Nebeneffekt
Und das ist nur eine Aufschrift, aber was ist, wenn die Einzahlung von dieser Funktion abhängt?
lustig), wenn Sie es bekommen)
Ich habe es richtig gemacht, nachdem ich die Ersetzung rückgängig gemacht habe, ist die erste Zeile nicht mehr 10 und die zweite TMP ist VALUE, aber nicht 10. D.h. die Substitution ist weit entfernt von einer Zuordnung.
lustig), wenn Sie es bekommen)
Ich habe es richtig gemacht, nachdem ich die Ersetzung rückgängig gemacht habe, ist die erste Zeile nicht mehr 10 und die zweite TMP ist ein WERT, aber nicht 10. D.h. eine Substitution ist noch lange kein Auftrag.
Ja, eine Substitution ist genau eine Substitution, eins-zu-eins. Wenn jedoch das VALUE-Makro in Ihrem Code definiert ist (nicht zu verwechseln mit der Präprozessor-Direktive), erweitert der Präprozessor TMP->VALUE->10 und wenn nicht, TMP->VALUE. In diesem Fall sind die Präprozessor-Direktiven nicht in den Code selbst involviert, sie sind beim Kompilieren nicht mehr vorhanden. Beispiel:
Ja, Substitution ist genau Substitution, eins zu eins. Wenn das VALUE-Makro während der Substitution in Ihrem Code definiert ist (nicht zu verwechseln mit den Präprozessoranweisungen), expandiert der Präprozessor einfach TMP->VALUE->10, und wenn nicht, TMP->VALUE. In diesem Fall sind die Präprozessor-Direktiven nicht in den Code selbst involviert, sie sind beim Kompilieren nicht mehr vorhanden. Beispiel:
Ja, wenn Sie die zweite VALUE-Ersetzung 20 auskommentieren, wird die VALUE-Variablendeklaration verschwinden und der Compiler wird sie nicht sehen und schimpfen)
Alles ist möglich, nur ein Makro muss hinzugefügt werden
Ergebnis: 20
Ich gebe auf)))
Wie ist sie definiert?
?
Ich gebe auf)))
Wie sicher
?
So schnell? Es sind noch nicht alle Spezialisten dabei... Wir werden eine Woche warten.
Tipp: Dies funktioniert auch (aber die Lösung ist etwas anders)
Ergebnis: 20:15
denn TMP wurde und wird immer noch durch WERT definiert.
Hier setzt die "Top-down"-Widerlegung an.
Andernfalls wäre TMP nicht "wie definiert, also bleibt es definiert", sondern wäre zuvor durch 10 ersetzt worden (an dessen Stelle VALUE tritt).
Der Präprozessor verarbeitet den Code also nicht Zeile für Zeile. Was noch zu klären ist, ist das Wie.
@A100, wenn es Ihnen nichts ausmacht, kurz und bündig.
Nicht interessant genug, um zu googeln und zu lesen, aber genug, um zu fragen.
Was ist falsch an meiner Logik?
Ich habe mir vorgestellt, dass die Zeichenfolgen nacheinander analysiert werden. Es gibt also keinen undefinierten Wert auf der rechten Seite:
Tipp: Dies funktioniert auch (aber die Lösung ist etwas anders)
Die Funktionsweise ist also identisch mit MACRO und MACRO2.
Was ist falsch an meiner Logik?