Podmíněný překlad

Direktivy podmíněného překladu jsou ze všech asi úplně nejdůležitější. Umožňují přeložit rozdílný kód v závislosti na tom, jaká nastala podmínka. Je tak např. možné překládat jiný kód pro debuggovací a jiný pro finální verzi produktu, jiný pro Windows a jiný pro DOS.

Nejčastěji se podmíněný překlad používá tak, že na začátku definujete symbol DEBUG a pak jisté části kódu překládáte pouze tehdy, když je tento symbol definován. To vám pak umožní nemít ve finální verzi kódu ladící výpisy, poznámky o tom, kde je co v paměti umístěno atd.

Překlad dle stavu přepínače ({$IFOPT})

Text co je mezi {$IFOPT Switch+} a {$ENDIF} se přeloží jen tehdy, když je přepínač $Switch zapnutý. Obdobně text co je mezi {$IFOPT Switch-} a {$ENDIF} se přeloží jen tehdy, když je přepínač $Switch vypnutý. Raději na ilustrativním příkladu:

program IFOPT;
begin
{$IFOPT N+}
 writeln('Momentalne je zapnuto generovani instrukci pro numericky koprocesor a vypocty jsou presnejsi');
{$ENDIF}
{$IFOPT R+}
 writeln('Je zapnuta kontrola rozsahu');
{$ENDIF}
{$IFOPT S+}
 writeln('Je zapnuta kontrola zasobniku');
 {$IFOPT R+}
  writeln('Je zapnuta kontrola zasobniku i kontrola rozsahu');
 {$ENDIF}
{$ENDIF}
end.

Pokud nevíte, co který přepínač znamená, můžete se podívat se do kapitoly Direktivy překladače.

Definice symbolu ({$DEFINE})

Pomocí {$DEFINE Symbol} řekneme kompilátoru symbol Symbol je definovaný. Sama o sobě tato direktiva nemá žádný význam a rozhodně není obdobou #define z programovacího jazyku C.

Zrušení symbolu ({$UNDEF})

{$UNDEF Symbol} zruší definici symbolu Symbol. I tato direktiva je sama o sobě naprosto k ničemu. Je k ničemu dokonce i při použití současně s direktivou $DEFINE.

Překlad při existenci symbolu ({$IFDEF})

Text mezi {$IFDEF Symbol} a {$ENDIF} se přeloží pouze tehdy, pokud je symbol Symbol definovaný. Spolu s $DEFINE tvoří tato direktiva velice silný nástroj. Mimo jiné i proto, že spousta symbolů je definována automaticky (např. symbol WINDOWS, pokud překládáme pro WINDOWS apod.).

Překlad při neexistence symbolu ({$IFNDEF})

Text mezi {$IFDEF Symbol} a {$ENDIF} se přeloží pouze tehdy, pokud symbol Symbol není definovaný. Podobně jako $IFDEF je toto velice užitečné.

Druhá větev podmíněného překladu ({$ELSE})

I direktivy mají své ELSE, co více dodat.

{$DEFINE DEBUG}
{$IFDEF DEBUG}
{$R+,S+,Q+,C+}
{$ELSE}
{$R-,S-,Q-,C-}
{$ENDIF}
program Ukazka;
begin
 {$IFDEF DEBUG}
 writeln('Nyni jsme v DEBUG modu');
 {$ELSE}
 writeln('Nyni jsme ve final modu.');
 {$ENDIF}
 {$IFOPT R+}
 writeln('Prepinac R je zapnuty');
 {$ENDIF}
end.

Konec podmíněného překladu ({$ENDIF})

Tato direktiva ukončuje příslušnou direktivu IF. Jednotlivé direktivy lze mezi sebe různě zanořovat, větvit...

Přepište všechny své programy tak, aby umožnily zapnout a vypnout ladící výstupy.