MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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 | |