#define funktioniert nicht
-
Hallo an alle,
ich steh mal wieder mit dem Präprozessor auf Kriegsfuss.
nachfolgend ein Code- Schnipsel:const int g_nDieZehn = 10; #define DIE_ZEHN_1 g_nDieZehn #define DIE_ZEHN_2 10 void Testfunktion() { // Das hier schmeisst der Präprozessor raus... #if DIE_ZEHN_1 != 0 int a; a++; #endif // ...aber das hier bleibt drin #if DIE_ZEHN_2 != 0 int b; b++; #endif }Die Zeilen 10 und 11 werden vom Präprozessor rausgeworfen,
die Zeilen 16 und 17 aber bleiben drin. Ich hätte hier erwartet
dass nichts rausgeworfen wird.
Kann mir jemand von Euch erklären warum Zeile 10 und 11 rausfliegen?
Wäre für Tips sehr dankbar,Gruss Ulli
-
CUlli schrieb:
ich steh mal wieder mit dem Präprozessor auf Kriegsfuss.
Den man eh so selten als möglich verwenden sollte...
CUlli schrieb:
Kann mir jemand von Euch erklären warum Zeile 10 und 11 rausfliegen? Wäre für Tips sehr dankbar,
Ich könnte mir vorstellen woran es liegen kann. Der Präprocessor wird vor jeglicher Compilierung als reine Textersetzung durchgeführt. Ich nehme mal an, das zu diesem Zeitpunkt keine Konstanten initialisiert sind, und er deshalb den Ausdruck negativ auswertet. Der Präprocessor wird wie gesagt vor jeglicher Codeanalyse etc. angewendet...
cu André
-
g_nDieZehn hat ja während des Preprocessing noch nicht den Wert 10 zugewesen bekommen, das passiert ja erst zur Laufzeit. Das kann also kaum funktionieren. Keine Ahnung, was genau er da vergleicht, aber mit Sicherheit nicht 10 und 0. Na ja, vermutlich wird er da eine 0 einsetzen...
Übrigens: du inkrementierst a bzw. b, ohne vorher einen Wert zugewiesen zu haben.
-
#define funktioniert einwandtfrei, es hapert eher an deinem Verständnis...
der Präprozessor ist eine rein TEXTUELL basierte Sache die VOR dem Compiler ausgeführt wird. Der kennst keine variablen, Datentypen oder sonst was, der kennt nur Texte und kann die Vergleiche oder ersetzen.
Jetzt betrachte mal die Zeichenketten "g_nDieZehn" und "10" sind die gleich?
(ja, später, wenn der Compiler den Sourcecode compiliert dann ist g_nDieZehn
eine Variable, aber der Präprozessor ist KEIN Compiler)
-
asc schrieb:
Den man eh so selten als möglich verwenden sollte...
Der Präprozessor kann in einigen Dingen aber ganz nützlich sein.
_matze schrieb:
g_nDieZehn hat ja während des Preprocessing noch nicht den Wert 10 zugewesen bekommen, das passiert ja erst zur Laufzeit.
Nein. Mit Integer-Literalen initialisierte Konstanten werden zur Compilezeit ausgewertet. Im neuen Standard können Compilezeit-Konstanten durch
constexprexplizit gekennzeichnet werden.
-
Nexus schrieb:
asc schrieb:
Den man eh so selten als möglich verwenden sollte...
Der Präprozessor kann in einigen Dingen aber ganz nützlich sein.

Nexus schrieb:
_matze schrieb:
g_nDieZehn hat ja während des Preprocessing noch nicht den Wert 10 zugewesen bekommen, das passiert ja erst zur Laufzeit.
Nein. Mit Integer-Literalen initialisierte Konstanten werden zur Compilezeit ausgewertet. Im neuen Standard können Compilezeit-Konstanten durch
constexprexplizit gekennzeichnet werden.Ok, wusste ich nicht.

-
_matze schrieb:
Ok, wusste ich nicht.

Das hast du sicher auch schon verwendet:
const int Size = 32; double Array[Size];Oder:
const int Size = 32; std::tr1::array<double, Size> Array;
-
Hehe, klar, jetzt wo du es sagst.

-
Nexus schrieb:
asc schrieb:
Den man eh so selten als möglich verwenden sollte...
Der Präprozessor kann in einigen Dingen aber ganz nützlich sein.
Das er manchmal nützlich ist, habe ich auch garnicht angezweifelt. Nur wird er meist an Stellen verwendet wo es mit Sprachmitteln besser geht.
-
Nexus schrieb:
asc schrieb:
Den man eh so selten als möglich verwenden sollte...
Der Präprozessor kann in einigen Dingen aber ganz nützlich sein.
_matze schrieb:
g_nDieZehn hat ja während des Preprocessing noch nicht den Wert 10 zugewesen bekommen, das passiert ja erst zur Laufzeit.
Nein. Mit Integer-Literalen initialisierte Konstanten werden zur Compilezeit ausgewertet.
Auf jeden Fall nicht während des Preprocessing.
-
Hallo nochmal,
besten Dank an alle fuer die Antworten,
Gruss Ulli