blob: 687d1a3a2aa47b24b94fcb56f4c45c93555ab77d [file] [log] [blame]
// Mit dem Praecompiler lassen sich symbolische Konstanten definieren. Dies
// z.B. sinnvoll, wenn eine Zahl eine bestimmte Bedeutung hat. Z.b. hat die
// Zahl 42 an sich keine fixe Bedeutung, hier ist die jedoch die Antwort!
#define ANTWORT 42
// Schreibt man nun irgendwo im Code ANTWORT, ersetzt der Praecompiler jedes
// Vorkommen von ANTWORT durch 42.
// auch komplexere Konstanten sind moeglich, z.B. ein Argument eines Defines:
#define ROOM(x) ("/d/ebene/zesstra/advent/room/"+x)
// Dies dient meist, um sich Schreibarbeit zu sparen. Formuliert man nach
// diesem #define ein ROOM("weg1"), erzeugt der Praecompiler hieraus:
// ("/d/ebene/zesstra/advent/room/weg1")
// Weiteres Beispiel:
#define BS(x) break_string(x, 78)
// erzeugt also aus BS("langer text") ein break_string("langer text",78)
// Es gehen auch mehrere Argumente:
#define BS(x,y) break_string(x, 78, y)
// BS("langer text", 78, "Zesstra sagt: ")
// -> break_string("langer text", 78, "Zesstra sagt: ")
// Solche Defines lassen sich schachteln:
#define HOME(x) ("/d/ebene/zesstra/advent/"+x)
#define ROOM(x) (HOME("room/"+x))
// Ein ROOM("weg1") wird nun durch (HOME("room/"+"weg1")) ersetzt
// und dieses wiederum durch ein
// (("/d/ebene/zesstra/advent/"+"room/"+"weg1")), was letztendlich ein
// (("/d/ebene/zesstra/advent/room/weg1")) ist.
// Letzteres wird haeufig benutzt bei der Erstellung von Gebieten um sich bei
// Umzuegen Arbeit zu sparen: zieht das Gebiet um (z.B. von /players/zesstra/
// nach /d/ebene/zesstra/advent/, reicht es aus, HOME zu aendern und man muss
// nicht 150mal den kompletten Pfad im Code aendern.
// moechte man ein Define ueber mehrere Zeilen definieren, muss der
// Zeilenumbruch mit einem \ escaped werden:
#define LOG(x) log_file("bla",\
"Dies ist ein laengerer Text.\n")
// WICHTIG: Hinter dem \ darf KEIN Leerzeichen, Tab o.ae. stehen!
// Tips:
// * Damit man Defines schnell als solche erkennt, sollten alle Defines
// grossgeschrieben werden: z.B. PL vs. pl
// * von komplexen Defines wird abgeraten, weil sie schnell Uebersicht
// und Effizienz ruinieren koennen
// * einige haeufig benutzte Defines finden sich in <defines.h>
// * der Driver definiert bestimmte Defines automatisch. Eine Liste
// findet sich in /doc/driver/predefined