Zum Hauptinhalt springen

Compiler-Anweisungen

Compiler-Anweisungen Verwendung von Compiler-Anweisungen

Über Compiler-Anweisungen wird die Übersetzung der Prozedur gesteuert. Alle Compileranweisungen beginnen mit dem Zeichen @ und müssen in der ersten Spalte einer Zeile stehen.

@A+ oder @A-

Diese Anweisung schaltet auf den A+ Compiler um (@A+). Im Designer wird standardmäßig der A+ Compiler verwendet.

@I:<Name>

Mit dieser Anweisung wird ein anderer Prozedurtext an der entsprechenden Stelle zur Übersetzungszeit eingebunden. <Name> ist dabei der Name der einzubindenden Prozedur. Die Anzahl von @I-Anweisungen ist nicht beschränkt.

Eine eingebundene Prozedur kann wiederum @I-Anweisungen enthalten. Die maximale Verschachtelungstiefe beträgt dabei 16 Ebenen. Sofern mehrmals dieselbe Prozedur angegeben ist, wird die Prozedur tatsächlich nur einmal eingebunden, da wiederholte Einbindungen ignoriert werden.

@C+ oder @C-

In den Prozeduren kann mit zwei unterschiedlichen 'Styles' gearbeitet werden. Dabei gibt es zum einen den Pascal-Style, bei dem die Syntax ähnlich der Sprache Pascal ist. Dieser Stil entspricht dem der 4.0 Prozeduren und ist standardmäßig eingestellt. Mit @C+ wird der C-Style aktiviert, bei dem die Syntax eher der Sprache C ähnelt.

Im Wesentlichen wirkt sich das auf den Standardsprachumfang aus. Zum Beispiel wird aus dem if-Konstrukt

IF <Bedingung>
THEN <Befehl>

im PASCAL-Style,

if (<Bedingung>)
<Befehl>

im C-Style. Weitere Unterschiede sind im Kapitel Style-Unterschiede beschrieben.

Innerhalb des Prozedurtextes können Bereiche in Abhängigkeit von Bedingungen übersetzt werden. Dazu können verschiedene Compileranweisungen verwendet werden.

@define und @undef

Mit der Anweisung @define kann eine Metavariable definiert werden. Die Anzahl der Metavariablen ist nicht beschränkt. Die Variable kann mit @undef wieder entfernt werden.

Syntax:

@define <Name>
@undef <Name>

Im weiteren Verlauf der Prozedur kann mit den Anweisungen @ifdef und @ifndef die Existenz der Metavariablen abgefragt werden. Innerhalb der Prozedur kann eine Variable wieder entfernt werden. Auf diese Weise kann zum Beispiel ein Debugmodus für nur eine Funktion aktiviert werden.

@ifdef oder @ifndef ... @else ... @endif

Mit diesen Anweisungen kann die Existenz bzw. die Nicht-Existenz einer Metavariablen geprüft werden.

Syntax:

@ifdef <Name>        @ifndef <Name>
<Prozedurtext> <Prozedurtext>
[@else [@else
<Prozedurtext>] <Prozedurtext>]
@endif @endif

Ist die Metavariable mit @define definiert, wird mit @ifdef der Prozedurtext nach der Anweisung übersetzt. Gibt es eine @else-Anweisung, wird der Prozedurtext im ELSE-Fall übersetzt, wenn die Metavariable nicht definiert ist.

Im Falle der Compileranweisung @ifndef wird der Prozedurtext nach der Anweisung nur dann übersetzt, wenn die angegebene Metavariable nicht definiert ist.

Der Prozedurtext kann beliebigen Text beinhalten, insbesondere weitere Compiler-Anweisungen. @ifdef und @ifndef können in bis zu 30 Ebenen geschachtelt werden.

Beispiele

Im folgenden Beispiel wird gezeigt, wie Debug-Anweisungen auch nach der Fehlersuche im Prozedurtext stehen bleiben können, um die relevanten Informationen auch noch bei einer späteren Fehlersuche ausgeben zu können.

@A+
@C+

@define debugmode

main
{
@ifdef debugmode
DbgConnect('*', false, false);
@endif
...
}

sub Funktion1
(
aParameter : int
) : int;

local
{
tRetValue : int;
}

{
@ifdef debugmode
@ifndef debugsilent
DbgTrace('Funktion Funktion1 aufgerufen');
DbgTrace('Parameter: ' + CnvAI(aParameter));
@endif
@endif
...
// Debugmodus abschalten
@undef debugmode
...
@ifdef debugmode
@ifndef debugsilent
DbgTrace('Rückgabewert: ' + CnvAI(tRetValue));
@endif
@endif
return(tRetValue);
}

Es können auch innerhalb einer Include-Prozedur mehrere Varianten implementiert werden. In den Prozeduren müssen lediglich vor dem Include die entsprechenden Meta-Variablen definiert werden.

@A+
@C+

@ifdef ungenau
define
{
mPi : 3.14
}
@endif

@ifdef genau5
define
{
mPi : 3.14159
}
@endif

@ifdef genau20
define
{
mPi : 3.14159265358979323846
}
@endif

In folgender Prozedur wird die Definition eingebunden:

@A+
@C+

@define genau5

@I:PI.def

...