blob: 687d1a3a2aa47b24b94fcb56f4c45c93555ab77d [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// Mit dem Praecompiler lassen sich symbolische Konstanten definieren. Dies
2// z.B. sinnvoll, wenn eine Zahl eine bestimmte Bedeutung hat. Z.b. hat die
3// Zahl 42 an sich keine fixe Bedeutung, hier ist die jedoch die Antwort!
4#define ANTWORT 42
5// Schreibt man nun irgendwo im Code ANTWORT, ersetzt der Praecompiler jedes
6// Vorkommen von ANTWORT durch 42.
7
8// auch komplexere Konstanten sind moeglich, z.B. ein Argument eines Defines:
9#define ROOM(x) ("/d/ebene/zesstra/advent/room/"+x)
10// Dies dient meist, um sich Schreibarbeit zu sparen. Formuliert man nach
11// diesem #define ein ROOM("weg1"), erzeugt der Praecompiler hieraus:
12// ("/d/ebene/zesstra/advent/room/weg1")
13
14// Weiteres Beispiel:
15#define BS(x) break_string(x, 78)
16// erzeugt also aus BS("langer text") ein break_string("langer text",78)
17
18// Es gehen auch mehrere Argumente:
19#define BS(x,y) break_string(x, 78, y)
20// BS("langer text", 78, "Zesstra sagt: ")
21// -> break_string("langer text", 78, "Zesstra sagt: ")
22
23// Solche Defines lassen sich schachteln:
24#define HOME(x) ("/d/ebene/zesstra/advent/"+x)
25#define ROOM(x) (HOME("room/"+x))
26// Ein ROOM("weg1") wird nun durch (HOME("room/"+"weg1")) ersetzt
27// und dieses wiederum durch ein
28// (("/d/ebene/zesstra/advent/"+"room/"+"weg1")), was letztendlich ein
29// (("/d/ebene/zesstra/advent/room/weg1")) ist.
30
31// Letzteres wird haeufig benutzt bei der Erstellung von Gebieten um sich bei
32// Umzuegen Arbeit zu sparen: zieht das Gebiet um (z.B. von /players/zesstra/
33// nach /d/ebene/zesstra/advent/, reicht es aus, HOME zu aendern und man muss
34// nicht 150mal den kompletten Pfad im Code aendern.
35
36// moechte man ein Define ueber mehrere Zeilen definieren, muss der
37// Zeilenumbruch mit einem \ escaped werden:
38#define LOG(x) log_file("bla",\
39 "Dies ist ein laengerer Text.\n")
40// WICHTIG: Hinter dem \ darf KEIN Leerzeichen, Tab o.ae. stehen!
41
42// Tips:
43// * Damit man Defines schnell als solche erkennt, sollten alle Defines
44// grossgeschrieben werden: z.B. PL vs. pl
45// * von komplexen Defines wird abgeraten, weil sie schnell Uebersicht
46// und Effizienz ruinieren koennen
47// * einige haeufig benutzte Defines finden sich in <defines.h>
48// * der Driver definiert bestimmte Defines automatisch. Eine Liste
49// findet sich in /doc/driver/predefined
50