Fehler, Irrtümer, Fragen - Seite 2865

 

Es ist nicht möglich, ein neues Produkt für den Marktplatz zu erstellen, es wird ein Fehler 500 angezeigt.

Das Produkt wurde erstellt und geprüft, es heißt, dass es veröffentlicht wurde, aber wenn Sie auf den Link klicken, erhalten Sie die Antwort 500.

 
fxsaber:

Funktioniert von oben nach unten als Textersetzung. D.h. "TMP" wird durch "VALUE" ersetzt.

Vladimir Simakov:

Dies ist kein Compiler - es ist ein Präprozessor)

wird zu

und der WERT ist nicht definiert.

Wie soll undef funktionieren?

 
Andrey Khatimlianskii:

Wie soll undef funktionieren?

Bis zu diesem Punkt findet eine "Textersetzung" statt.

 
Vladimir Simakov:

Es ist kein Compiler - es ist ein Präprozessor)

wird zu

und der VALUE ist undefiniert.

#define  VALUE (VALUE*2)

Wenn ich es richtig verstehe, ist der Wertetyp VALUE*2 const und an die Substitution selbst gebunden, d.h. der VALUE ist auch eine Konstante. Der Compiler erstellt zwei Konstanten.

Wenn ja, muss es eine neue Substitution erstellen.

#define  VALUE1 (VALUE*2)
#define  VALUE VALUE1

Und es ist nicht korrekt, wenn VALUE oberhalb des Codes als Konstante definiert wurde.

 
fxsaber:

Bis zu diesem Punkt findet eine "Textersetzung" statt.

Stimmt nicht überein, ändert TMP inVALUE in der Zeile "#define VALUE (TMP*2)", die danach kommt.

 
Andrey Khatimlianskii:

Das ergibt keinen Sinn, denn in der Zeile "#define VALUE (TMP*2)", die danach kommt, wird TMP zuVALUE.

#define  MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef  MACROS
Und so geht die Ersetzung weiter, bis alle Ersetzungen abgeschlossen sind.
 
fxsaber:
Und so gehen die Ersetzungen weiter und weiter, bis sie alle enden.

Es gibt einen Code:

#define  VALUE 10       // 
#define  TMP VALUE      // 
#undef  VALUE           // 
#define  VALUE (TMP*2)  // 

Die erste Ersetzung ändert VALUE in 10 im gesamten Code bis zu #undef VALUE, so dass dies übrig bleibt:

#define  TMP 10
#define  VALUE (TMP*2)

Mit der nächsten Substitution wird der TMP auf 10 geändert. Es stellt sich heraus

#define  VALUE (10*2)

Was mache ich falsch?

 
Andrey Khatimlianskii:

Es gibt einen Code:

Die erste Ersetzung ändert VALUE in 10 im gesamten Code bis zu #undef VALUE, so dass dies übrig bleibt:

Mit der nächsten Ersetzung wird der TMP auf 10 geändert. Es stellt sich heraus

Was mache ich falsch?

TMP wird nicht durch 10 ersetzt, sondern durch den WERT, aber wenn der WERT definiert ist (was sehr mühsam ist), ist es 10.

Schauen Sie sich diese Schritt für Schritt an:

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE            
#define  VALUE (TMP*2)

void OnStart(void)
{
   Print(VALUE)
}

Der Präprozessor fügt Print

Print((TMP*2));

und ersetzt dann, wiederum ohne Tricks, was? Richtig:

Print((VALUE*2));

und löscht dann alle Präprozessor-Direktiven, und erst danach erhält der Compiler dies:

void OnStart(void)
{
   Print((VALUE*2));
}
 
Vladimir Simakov:

TMP ist nicht 10, sondern VALUE wird durch TMP ersetzt, und wenn VALUE definiert ist (was ein Problem darstellt), ist es 10

Schauen Sie sich diese Schritt für Schritt an:

Der Präprozessor fügt Print

und ersetzt dann, wiederum ohne Tricks, was? Richtig:

und löscht dann alle Präprozessor-Direktiven, und erst danach erhält der Compiler dies:

Das nennt man nicht "von oben nach unten".

 
Andrey Khatimlianskii:

Das nennt man nicht Top-Down.

Verzeihung, ich bin beim Versuch, mich zu erklären, durcheinander gekommen)))

Ein weiteres Mal:

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE            
#define  VALUE (TMP*2)

Zum Zeitpunkt der zweiten VALUE-Definition ist das VALUE-Makro noch nicht definiert, so dass VALUE definiert ist als

(VALUE*2)

denn TMP wurde und wird durch WERT definiert.

Aber TMP wird nach der zweiten VALUE-Definition erweitert zu

(TMP*2)

(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:

#define  min(A,B) ((A)<(B)?(A):(B))

long Foo(int x) {return x*x;}

void OnStart(void)
{
   int a=500,
       b=20;
   Print(min(500,Foo(b))); //400
}

und jetzt fügen wir der Funktion noch etwas Böses hinzu, nämlich einen Nebeneffekt

#define  min(A,B) ((A)<(B)?(A):(B))

long Foo(int x){
   Print("Увидивший это второй раз - нубяра vulgaris");
   return x*x;}

void OnStart(void)
{
   int a=500,
       b=20;
   Print(min(500,Foo(b)));
}

Und das ist nur eine Aufschrift, aber was ist, wenn die Einzahlung von dieser Funktion abhängt?