define
define
Deklaration von Definitionen
Details
- Siehe: Verwandte Befehle
Syntax:
define
{
[[ <name> [[ <argument>, ]] : <Zeichenfolge> ]]
}
Mittels einer Definition wird einem Namen eine frei definierbare Zeichenfolge zugewiesen. Innerhalb der Prozedur kann dann anstelle der jeweiligen Zeichenfolge dieser Name eingesetzt werden. Damit können zum Einen symbolische Konstanten benutzt werden, bei denen einem konstanten Wert ein symbolischer Name zugeordnet wird, zum Anderen Makros benutzt werden, bei denen einem Namen mit zugehörigen Argumenten ein entsprechender Ausdruck oder Befehlsfolge zugeordnet wird.
Der Name ist die Bezeichnung der Definition, mit der später auf sie zugegriffen wird (Namensvergabe unter global). Nach dem Doppelpunkt folgt der Definitionstext bis zum Ende der Zeile. Eine mehrzeilige Definition ist daher nicht möglich.
Beispiel:
define
{
mMaxPositions : 64
mMaxElements : MaxPositions * 2 - 1
mCRLF : StrChar(13) + StrChar(10)
mValueArray3D(a,b,c) : int[a * b * c]
mNetto(Value) : Rnd(Wert * 0.869565, 2) // ohne Mwst
mRecReadLock(FileNo,KeyNo) : (RecRead(FileNo, KeyNo, _RecLock) = _rOk)
}
In den ersten beiden Definitionen werden MaxPositions und MaxElements als symbolische Konstanten definiert. Bei den nachfolgenden Definitionen werden zusätzlich Argumente angegeben, für die dann später die entsprechenden Werte eingesetzt werden. Bis zu 24 Argumente pro Definition sind zulässig, wobei der Name eines Arguments frei wählbar ist, solange er nicht mit bereits deklarierten Namen konfliktiert. Kommentare innerhalb des Definitionstextes werden ignoriert.
Bei Definitionen handelt es sich immer um einen reinen Textersatz, das heißt, dass bei Verwendung einer Definition diese innerhalb der Zeile durch den Definitionstext (inklusive der Parameter) ersetzt wird. Daher können Definitionen für fast jeden Zweck benutzt werden, allerdings finden keinerlei syntaktische Prüfungen durch den Compiler bei der Deklaration einer Definition statt. So kann beispielsweise in einer Definition mit Variablen gearbeitet werden, die an dieser Stelle noch gar nicht deklariert wurden. Bei der Verwendung eines der obigen Beispiele passiert also folgendes:
- aus:
if mRecReadLock( 1 , 2 ) - wird:
if ( RecRead ( 1 , 2 , _RecLock ) = _rOk )
Es ist grundsätzlich darauf zu achten, dass Anzahl, Art und Umfang von Definitionen ein noch überschaubares Maß nicht übersteigen und Definitionen nur in sinnvollen Fällen eingesetzt werden, da sonst der positive Nutzen ins Gegenteil verkehrt wird; Prozeduren werden bei unvernünftigem Einsatz von Definitionen wartungsunfreundlich, schlecht überschaubar und schwierig zu testen.
Innerhalb einer Prozedur können beliebig viele Definitionen als auch Definitionssektionen deklariert werden. Daher ist es empfehlenswert, häufig benutzte Definitionen in einer Prozedur zusammenzufassen, die dann von anderen Prozeduren aus per @I-Anweisung eingebunden wird.
Bei geschachtelten Definitionen (der Definitionstext einer Definition enthält andere Definitionen) ist darauf zu achten, dass bei der Verarbeitung eines Definitionsaufrufs eine oder mehrere Ersetzungen in der jeweiligen Zeile vorgenommen werden. Dabei verlängert sich die Zeile entsprechend. Die Länge einer Zeile kann dabei maximal 2000 Zeichen betragen.
Compiler-Makros:
Im Compiler sind folgende Makros vordefiniert:
__PROC__: – Aktuelle Prozedur als Zeichenkette__FUNC__: – Aktuelle Funktion als Zeichenkette__PROCFUNC__: – Aktuelle Prozedur und Funktion als Zeichenkette__LINE__: – Aktuelle Zeile als Zahl