#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

#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:

#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