-
Notifications
You must be signed in to change notification settings - Fork 11
Makros
Für das Definieren/Benutzen von Variablen und Funktionen gibt es die folgenden Makros
Makro-Name | Argumente | Beschreibung | Preprocessed Format | Bemerkung |
---|---|---|---|---|
GVAR | name |
Baut den Namen einer globalen Variable zusammen | <ModName>_<ModulName>_<name> | |
DFUNC | name |
Baut den Namen einer Funktion zusammen | <ModName>_<ModuleName>_fnc_<name> | |
FUNC | name |
Baut den Namen einer Funktion zusammen und führt ggf. einen check aus, ob diese Funktion existiert | <ModName>_<ModuleName>_fnc_<name> | Der Check (aktiviert in der Dev-Version) führt zu Fehlern, wenn man versucht, via FUNC variablen zuzuweisen |
CFUNC | name |
Baut den Namen einer CLib-API-Funktion zusammen (führt Checks aus) | CLib_fnc_<name> | Bezüglich Checks gilt das bereits Gesagte |
OFUNC | name |
Baut den Namen einer OPT-API-Funktion zusammen (führt Checks aus) | OPT_fnc_<name> | Bezüglich Checks gilt das bereits Gesagte |
Für jedes dieser Makros gibt es noch eine "Q-Variante" (z.B. QGVAR
, die das selbe macht, aber das Ergebnis als String zurückliefert (also in Anführungszeichen verpackt)). Das ist für Operationen mit setVariable
, etc. sehr nützlich.
Wichtig: Um inline-Funktionen zu definieren, darf ausschließlich das DFUNC
-Makro verwendet werden.
Für eine detaillierte Beschreibung, was es mit dem Konzept der Assertions
auf sich hat, siehe https://de.wikipedia.org/wiki/Assertion_(Informatik).
Kurz gesagt, lassen sich damit einige Checks in den Code einbauen, die einen Fehler loggen, wenn sie fehlschlagen. DIes kann dabei helfen die Ursache für irgendwelche Bugs zu finden oder überhaupt frühzeitig zu erkennen, dass etwas nicht so läuft, wie es sollte.
Aktuell existieren einige ASSERT_IS_XYZ
-Makros, die überprüfen, ob eine übergebene Variable vom Datentyp XYZ ist. Wenn ja, dann passiert nichts weiter und wenn nein, dann wird ein entsprechender Fehler geloggt.
Wichtig: Alle Assertions werden nur dann ausgeführt, wenn das ISDEV
-Makro definiert wurde. Das heißt, dass die Assertions nur in der Entwicklerversion (Dev-Version) der Mod ausgeführt werden.
Andernfalls können sie aber trotzdem im Code stehen. Sie werden durch den Preprocessor aber durch einen leeren String ersetzt.
Makro-Name | Argumente | Beschreibung | Bemerkung |
---|---|---|---|
ASSERT_IS_TYPE |
var ,type
|
Überprüft, ob var vom selben Datentyp, wie type ist |
Überprüft wird var isEqualType type
|
ASSERT_IS_ARRAY | var |
Überprüft, ob var vom Type Array ist |
|
ASSERT_IS_BOOL | var |
Überprüft, ob var vom Typ Boolean ist |
|
ASSERT_IS_CODE | var |
Überprüft, ob var vom Typ Code ist |
|
ASSERT_IS_CONFIG | var |
Überprüft, ob var vom Typ Config ist |
|
ASSERT_IS_CONTROL | var |
Überprüft, ob var vom Typ Control ist |
|
ASSERT_IS_DISPLAY | var |
Überprüft, ob var vom Typ Display ist |
|
ASSERT_IS_GROUP | var |
Überprüft, ob var vom Typ Group ist |
|
ASSERT_IS_OBJECT | var |
Überprüft, ob var vom Typ Object ist |
|
ASSERT_IS_SCALAR | var |
Überprüft, ob var vom Typ Scalar ist |
Number und Scalar ist das Gleiche |
ASSERT_IS_NUMBER | var |
Überprüft, ob var vom Typ Number ist |
Number und Scalar ist das Gleiche |
ASSERT_IS_SCRIPT | var |
Überprüft, ob var vom Typ Script ist |
|
ASSERT_IS_SIDE | var |
Überprüft, ob var vom Typ Side ist |
|
ASSERT_IS_STRING | var |
Überprüft, ob var vom Typ String ist |
|
ASSERT_IS_TEXT | var |
Überprüft, ob var vom Typ Text ist |
"Text" wird auch oft als "Structured Text" bezeichnet |
ASSERT_IS_LOCATION | var |
Überprüft, ob var vom Typ Location ist |
|
ASSERT_IS_NAMESPACE | var |
Überprüft, ob var vom Typ Namespace ist |
|
ASSERT_IS_NULL | var |
Überprüft, ob var vom Typ Null ist |
Achtung: NULL != NIL |
ASSERT_IS_NOT_NULL | var |
Überprüft, dass var nicht vom Typ Null ist |
|
ASSERT_IS_NIL | var |
Überprüft, ob var undefiniert ist |
|
ASSERT_IS_NOT_NIL | var |
Überprüft, dass var nicht* undefiniert ist |
|
ASSERT_IS_POSITION | var |
Überprüft, ob var vom Typ Position ist |
Eine Position ist entweder Position2D oder Position3D |
ASSERT_IS_POSITION2D | var |
Überprüft, ob var vom Typ Position2D ist |
Position2D == Zahlenarray der Länge zwei |
ASSERT_IS_POSITION3D | var |
Überprüft, ob var vom Typ Position3D ist |
Position3D == Zahlenarray der Länge drei |
ASSERT_IS_INTEGER | var |
Überprüft, ob var ein Integer ist |
Integer == Ganzzahl |
ASSERT_TRUE | var |
Überprüft, dass var true zurück gibt |
|
ASSERT_FALSE | var |
Überprüft, dass var false zurück gibt |
|
ASSERT_ARRAY_LENGTH |
var ,length
|
Überprüft, dass var ein Array der Länge length ist |
Das Testen auf mehrere Längen ist hiermit nicht möglich |
ASSERT_ALIVE | var |
Überprüft, ob alive var true zurück gibt |
Kann nur auf Objekte angewendet werden |
ASSERT_DEAD | var |
Überprüft, ob alive var false zurück gibt |
Kann nur auf Objekte angewendet werden |
Benutzt werden könnte das Beispielsweise in diesem Kontext:
params ["_myString", "_myNumber", "_myObject"];
ASSERT_IS_STRING(_myString);
ASSERT_IS_NUMBER(_myNumber);
ASSERT_IS_OBJECT(_myObject);
Auch via params
lassen sich direkt beim Zuweisen der Variablen deren Typ überprüfen. Der Nachteil gegenüber der Assert-Methode ist jedoch, dass diese Prüfung dann zwangsläufig immer den entsprechenden Overhead mit sich bringt, wohingegen die Makro-Variante "abschaltbar" ist, sodass der gesamte Overhead verschwunden ist.