Ich sehe mir einen Code an und denke, dass die ganze Logik hier keinen Sinn ergibt. Es scheint ziemlich schlecht zu sein, ein solches Makro zu haben. Als Beispiel verwende ich dieses Makro zweimal und ich bekomme beide Zeichenfolgen zur Ausgabe.Statische Variablen innerhalb von Makros
TESTING("hello");
TESTING("world");
Der Präprozessor einfach den Bezeichner mit dem Codeblock ersetzt, ist es die gleiche wie Kopieren/Einfügen des Code, so sollte nicht der Compiler gibt für Erst-Durchlauf eines Neudefinition Fehler, wenn diesen Makro verwendet mehrmals? (Wenn Sie manuell in
main
,static bool firstPass = true;
mehrere Male einfügen, wird der Compiler einen Fehler geben.)Wenn
firstPass
static
ist, wird es erstellt und nur einmal initialisiert. Wenn Sie dieses Makro mehrmals verwenden, sollten Sie (abgesehen von der ersten Verwendung) keine Ergebnisse erzeugen, da das Flag auffalse
gesetzt wurde und es immer nochcout
ist.
Ein bisschen verwirrt.
#define TESTING(input) \
{ \
static bool firstPass = true; \
if (firstPass) { \
std::cout << input; \
firstPass = false; \
} \
}
Ja gedruckt wird, Es ist schlecht, Makros anstelle von Funktionsvorlagen zu verwenden. – LogicStuff
Dieser Code ist sinnlos. Jedes Mal, wenn du es anrufst, hast du einen neuen "FirstPass" aufgrund von Scoping-Regeln. – NathanOliver
Ihr Missverständnis scheint mit dem Makroinhalt zu sein (speziell dem Block, '{...}') und nicht mit dem Makro selbst. Das heißt, wenn Sie den Makroinhalt manuell kopieren und einfügen, wie Sie es nennen, haben Sie das gleiche Problem, ohne dass Makros beteiligt sind. – chris