Fehler, Irrtümer, Fragen - Seite 2864

 
Andrey Khatimlianskii:

Warum funktioniert es dann nicht?

Höchstwahrscheinlich funktioniert dieser Ansatz nirgendwo. Denn es findet eine Substitution statt, bei der der WERT auf der rechten Seite undefiniert ist.

#define  VALUE (VALUE*2)
 
fxsaber:

Dieser Ansatz funktioniert wahrscheinlich nicht überall. Denn es findet eine Substitution statt, bei der der WERT auf der rechten Seite undefiniert ist.

Und es ist böse, die Makro-Substitution eines anderen zu ändern. Dies gilt umso mehr, wenn es sich um vordefinierte Umgebungsmakros handelt. Es spielt keine Rolle, wo sich das übergeordnete Makro am Ende befindet, nachdem alle Dateien des Projekts zusammengestellt wurden. Es ist besser, ein eigenes _VALUE-Makro zu definieren.
 
Vladimir Simakov:
Ja, und es ist böse, die Makro-Substitution eines anderen zu ändern.

Ohne dieses Übel wäre es nicht passiert.

 
Vladimir Simakov:
Und es ist böse, die Makro-Substitution eines anderen zu ändern. Vor allem, wenn es sich um vordefinierte Umgebungsmakros handelt. Es spielt keine Rolle, wo am Ende, nachdem alle Dateien des Projekts zusammengestellt sind, die Überschreibung des Makros erscheint. Definieren Sie lieber Ihr eigenes _VALUE-Makro.
Darf ich fragen, warum es nicht möglich ist, einer globalen Variablen einen WERT-Wert zuzuweisen und diesen dann zu multiplizieren und in der endgültigen Definition zu ersetzen?
 
Valeriy Yastremskiy:
Darf ich fragen, warum Sie nicht eine VALUE-Zuweisung an eine globale Variable verwenden, diese multiplizieren und im endgültigen Define ersetzen können?

Sie können das, aber dann geht der Sinn der Makro-Substitution verloren (Werte im Code ersetzen). Es bleibt zu hoffen, dass der Compiler den Typ const (haben Sie übrigens den Variablentyp definiert?) in den Typ c++ constexpr umwandelt

Aber ansonsten, ja, das können Sie.

#ifdef  MACROS
   const int gValue=2*VALUE;
   #undef  VALUE
   #define  VALUE gValue
#endif
 
Vladimir Simakov:

Aber dann, ja, Sie können.

Damit wird es nicht funktionieren.

void Func( int = VALUE ) {}
 
fxsaber:

Mit dem hier wird es nicht funktionieren.

Richtig. Noch einmal, lassen Sie uns constexpr bitten, es so zu machen
constexpr auto x = 100;

void Foo(int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
    return 0;
}
 
fxsaber:

Dieser Ansatz funktioniert wahrscheinlich nicht überall. Da es sich um eine solche Substitution handelt, bei der der WERT auf der rechten Seite nicht definiert ist.

Offenbar verstehe ich überhaupt nicht, wie der Compiler funktioniert. Ich habe mir vorgestellt, dass Zeichenketten sequentiell geparst 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
 
Andrey Khatimlianskii:

Offenbar verstehe ich überhaupt nicht, wie der Compiler funktioniert. Ich habe mir vorgestellt, dass Zeichenketten sequentiell analysiert werden. Es gibt also keinen undefinierten Wert auf der rechten Seite:

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

 
Andrey Khatimlianskii:

Offenbar verstehe ich überhaupt nicht, wie der Compiler funktioniert. Ich habe mir vorgestellt, dass Zeichenketten sequentiell analysiert werden. Es gibt also keinen undefinierten Wert auf der rechten Seite:

Es ist nicht der Compiler - es ist der Präprozessor)

#define  VALUE (TMP*2)

wird zu

#define  VALUE (VALUE*2)

und Ihr VALUE ist undefiniert.