Fehler, Irrtümer, Fragen - Seite 2866

 

Alles ist möglich, nur ein Makro muss hinzugefügt werden

#define  VALUE 10

MACRO( VALUE, VALUE2 )

#define  VALUE   VALUE2*2

void f( int i = VALUE ) { Print( i ); }
void OnStart()
{
        f();
}

Ergebnis: 20

 
A100:

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.

 
Vladimir Simakov:

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.

 
Valeriy Yastremskiy:

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:

#define  VALUE 10
#define  TMP VALUE

void OnStart()
{
   Print(TMP); //10
if (false){
   #undef  VALUE
   #define  VALUE 20
   Print(TMP);}
else Print(TMP); //20
}
 
Vladimir Simakov:

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)

 
A100:

Alles ist möglich, nur ein Makro muss hinzugefügt werden

Ergebnis: 20

Ich gebe auf)))

Wie ist sie definiert?

MACRO

?

 
Vladimir Simakov:

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)

#define  VALUE1 10
#define  VALUE2 5

MACRO2( VALUE1, VALUE12 )
MACRO2( VALUE2, VALUE22 )

#define  VALUE1  VALUE12*2
#define  VALUE2  VALUE22*3

int f1( int i = VALUE1 ) { return i; }
int f2( int i = VALUE2 ) { return i; }
void OnStart()
{
        Print(f1(),":",f2());
}

Ergebnis: 20:15

 
Vladimir Simakov:

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:

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
A100:

Tipp: Dies funktioniert auch (aber die Lösung ist etwas anders)

Die Funktionsweise ist also identisch mit MACRO und MACRO2.

 
Andrey Khatimlianskii:

Was ist falsch an meiner Logik?

#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