#define name
Definiert den angegebenen Namen als eine Bedingung für späteres Einbinden oder
Herausnehmen von Zeilen im Skript (siehe #ifdef).
Beispiel:
#define TEST
...
#ifdef TEST
printf("This is a test!");
#endif
#define name value
Immer, wenn im Skript der name unter #define erscheint,
wird
er durch den Wert (value), der ein anderer Name, eine Zahl oder
ein einfacher
Ausdruck sein kann, ersetzt. Das Ersetzen von Namen macht Funktionen besser 'lesbar',
z.B. indem man den skill-Parametern
von Entities sinnvolle
Namen gibt.
Beispiel:
#define PI 3.14159
#define HEALTH skill17
#define WINAPI __stdcall
...
x = 2.0*PI;
my.HEALTH -= 50;
long WINAPI MessageBox(HWND,char *,char *,long);
Bemerkungen
- #defines sind innerhalb des gesamten nachfolgenden Skripts gültig, mit Ausnahme der Teile, die nicht dem C-Standard entsprechen, wie Shader-Code oder Engine-Objektdefinitionen wie PANEL*, MATERIAL* etc.
- Der selbe Namen oder das selbe Macro kann beliebig oft im Code definiert und umdefiniert werden, so dass es in verschiedenen Teilen des Code unterschiedlich interpretiert wird.
- #defines werden während des Kompilierens ausgewertet und können also logischerweise bei einem fertig kompilierten und publizierten Projekt nicht mehr geändert werden.
- !! #define-Zeilen enden normalerweise nicht auf einen Semikolon, es sei denn, Sie wollen value aus irgendeinem Grund mit einem Semikolon beenden. Einige PRAGMA-defines (s. u.) erfordern einen Semikolon zum Beenden eines Text-Strings.
- Es ist eine Gepflogenheit, definierte Namen GROSS zu schreiben.
#undef name
Macht die Definition eines zuvor definierten Namens rückgängig.
#define macro(parameter,..) expression(parameter,..)
Definiert ein macro als Ersatz oder Abkürzung für
einen Ausdruck. Wann immer das Macro im Code auftaucht, wird es durch den Ausdruck
ersetzt.
Macros funktionieren so ziemlich wie Funktionen, es gibt aber einige kleine
Unterschiede. Da Macros direkt im Skript ersetzt werden, gibt es keine Auswirkungen
auf die Programm-Performance (wie es bei Funktionen der Fall ist), sie produzieren
aber mehr Code als Funktionen. Normalerweise werden sie nur für ziemlich
kleine Ausdrücke benutzt.
Beispiele (aus acknex.h):
#define set(obj,flag) obj.flags |= (flag)
#define reset(obj,flag) obj.flags &= ~(flag)
#define toggle(obj,flag) obj.flags ^= (flag)
#define is(obj,flag) (obj.flags & (flag))
#define zero(ptr) memset((void*)&ptr,0,sizeof(ptr))
#define macro(parameter,..) expression(parameter##token,..)
Der Misch-Operator ## fügt dem Parameter den token hinzu. Dies ist hilfreich zum Neu-Definieren einer Variablen oder von Funktionsnamen in einem Makrol.
Example:
#define merge3(name) merge(name##1,name##2,name##3) // merge3(test) is evaluated to merge(test1,test2,test3)
Einige spezielle #defines:
#define PRAGMA_ZERO
Initialisiert alle lokalen Variablen auf
0. Dadurch wird die Funktion etwas langsamer, aber alle Variablen
bekommen einen festen Startwert.
Gut geeignet zum schnellen Testen ob ein zufülliges Problem mit einer nicht initialisierten lokalen Variablen zusammenhängt.
#define PRAGMA_POINTER
Schaltet die automatische Erkennung des lite-C-Pointers aus und behandelt Pointer wie in C/C++. Zum Übergeben von Adressen an Funktionen muß der Adressverwalter (&) verwendet werden und der -> -Operator für Elemente eines Strukt-Pointers. Andernfalls wird ein Syntaxfehler ausgegeben.
#define PRAGMA_API FunctionName;ModuleName!ProcName
Lädt den Funktions-Prototypen FunctionName aus der
Funktion ProcName in den DLL-ModuleName (s. Using
DLLs). Beispiel:
#define PRAGMA_API MessageBox;user32!MessageBoxA
#define PRAGMA_PLUGIN "dllname";
Öffnet ein DLL plugin mit dem gegebenen Namen, der sich im Work-Ordner oder einem Pfad relativ zum Work-Ordner befindet (Plugins im Default-Ordner PLUGINDIR werden automatisch geöffnet. Anschliessend sind Plugin-Funktionen und Engineerweiterungen verfügbar.
PRAGMA_PLUGIN wird nur während des Kompilierens ausgewertet und nur für Engine-Plugins benutzt, nicht für allgemeine DLLs. In einem gepublishten Projekt werden sämtliche Plugin-DLL-Dateien im Ordner PLUGINDIR erwartet. Alle anderen DLLs müssen entweder im Anwendungsordner oder im DLL-Pfad von Windows sein. Beispiel:
#define PRAGMA_PLUGIN "dlls\\driver.dll"
#define PRAGMA_PRINT"text";
Stellt, sobald der Compiler diese Zeile erreicht, den gegebenen
Text im Startup-Fenster der Engine dar. Das ist hilfreich zum
Ausgeben von Engine-Startupmeldungen oder um herauszufinden,
an welcher Stelle der Compiler abstürzt wenn eine beschädigte
Datei
während des Kompillierungsprozesses geladen wird. Beispiel:
#define PRAGMA_PRINT "\nThis is a compiler message!";
#define PRAGMA_PATH"path";
Sucht
nach Include- und anderen im Pfad angegebenen Dateien, wenn diese
im aktuellen Ordner nicht gefunden wurden. Das ist dem PATH-Statement
in einer Projektdatei ähnlich mit Ausnahme der Tatsache, daß
per PRAGMA_PATH angegebene Pfade auch für include-Dateien
verwendet werden. Beispiel:
#define PRAGMA_PATH "%EXE_DIR%\Map-Editor\Scripts";
Bemerkungen:
- Pfade werden in der angegebenen Reihenfolge gesucht. Sie beziehen
sich auf den gegenwärtigen Work-Ordner. Um Ihr Projekt an andere
Stellen kopieren zu können, verwenden Sie für sämtliche
zu Ihrem Projekt gehörenden Dateien abhängige Pfade und
absolute Pfade für all die Dateien, die sich an einer absoluten
Stelle Ihrer
Hard-Disk befinden (wie Template-Skripte).
- Beginnt der Pfad mit "%EXE_DIR%", handelt
es sich um einen Unterordner des Programm-Ordners (wie "%EXE_DIR%\templates\images").
Verwenden Sie davon abgesehen keine Sonderzeichen
oder Leerschritte in Ihren Ordner-Namen.
- Theoretisch können Sie bis zu 32 PATH-Namen
benennen, es ist allerdings besser, deutlich unter diesem Limit
zu bleiben. Jeder Ordner wird der Reihe nach durchsucht bis eine
angegebene Datei gefunden ist, gibt es also viele Pfade, kann
dies die Ladezeit merklich verlängern.
- PRAGMA_PATH wird nur während des Kompilierens ausgewertet. In einem gepublishten Projekt sind alle Dateien per Default im Projektordner abgelegt. Um in einem gepublishten Projekt Unterordner zu benutzen, fügen Sie diese während der Laufzeit mittels add_folder() hinzu oder Sie verwenden eine .wdl Projektdate.
- Von externen Applikationen können Pfade mittels des Arrays
pPaths gelesen werden.
- Pfade dürfen, genau wie Variablen, Dateien oder Objektnamen, keine Leerzeichen enthalten.
#define PRAGMA_LEVEL "levelname";
Alle Entities der gegebenen WMP-Datei werden automatisch in den
gepublishten Spiele-Ordner respektive Quelle eingefügt. Verwenden
Sie dies, um sicherzugehen, daß sämtliche Unter-Entities von Leveln
oder Map-Entities mit einbezogen sind. Beispiel:
#define PRAGMA_LEVEL "level2.wmp"; // include all entities from level 2
#define PRAGMA_BIND "filename";
Die gegebene Datei wird von WED's Publish-Funktion in den
Spiele-Ordner kopiert und/oder in die Quelldatei aufgenommen. Wenn
der Dateiname im Skript in Anführungszeichen steht oder die Datei
Teil eines mit dem PRAGMA_LEVEL-Statement gegebenen
Levels ist, brauchen Sie dieses Statement nicht. Beispiel:
#define PRAGMA_BIND "model.mdl"; // The model.mdl file is included in the game folder and resource
Siehe auch:
#ifdef, #ifndef, #else, #endif, macros
► Aktuelle Version Online