Podmíněný překlad - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Podmíněný překlad

serial

19. března 2002, 00.00 | Tak jako v jiných jazycích podmíněný překlad v Delphi patří k důležité části jazyka. Pomocí podmíněného překladu lze řešit množství problémů, přičemž pro mnohé z nich je to nejlepší cesta. Podíváme se také na novinky v Delphi 6.

Kdo by neznal. Tak jako v jiných jazycích podmíněný překlad v Delphi patří k důležité části jazyka. Pomocí podmíněného překladu lze řešit množství problémů, přičemž pro mnohé z nich je to nejlepší cesta.

Zhruba v půli článku se podíváme na novinky v Delphi 6, které se týkají podmíněného překladu.

Dalo by se říci, že by vynalezen kvůli potřebě co nejednoduššího zápisu změny množství kódu. Já osobně téměř ve všech programech mám direktivu DEBUG či FULLWARE. Párkrát jsem již si definoval i TRIAL. Je zřejmé, že program zkompilovaný z jednou z těchto direktiv se bude chovat zcela odlišně resp. bude v něm obsažen rozdílný kód a to jen změnou jednoho slova.

První co musíme udělat, chceme-li používat podmíněný překlad je definovat si svoji direktivu. To se provádí následujícím příkladem, kde text může být dle vaší libosti (Delphi všeobecně nerozlišuje velikost písmen).

{$DEFINE DEBUG}

Kdekoliv se pak můžeme testovat je-li resp. není-li již definována. To se provádí přes IFDEF resp. IFNDEF, testujeme-li zda není definována. Bohužel v textu, který následuje nelze používat booleanovskou logiku — nepřišel jsem na to a snad ani help se o tom nezmiňuje.

IFDEF resp. IFNDEF lze ještě rozšířit o ELSE. Jedná se spíše o zjednodušení zápisu, protože to co to dovede dokážete i s těmi dvěmi základními. Jednoduchý příklad by mohl vypadat takto:

{$DEFINE TRIAL}

{$IFDEF TRIAL}
     Writeln('!!! This copy is trial !!!');
{$ELSE}
     Writeln('...');
{$ENDIF}

{$IFNDEF TRIAL}
     Writeln('!!! This copy is NOT trial !!!');
{$ENDIF}

Bude-li nám nějaká definovaná direktiva nepříjemná, můžeme ji kdekoliv odstranit. Použijeme k tomu direktivu UNDEF. Jednoduchý příklad by mohl vypadat takto:

{$DEFINE DEBUG}

{$IFDEF DEBUG}
     Writeln('Debug is on.'); // this code executes
     {$UNDEF DEBUG} // !!! undefine !!!
{$ELSE}
     Writeln('Debug is off.'); // this code does not execute
{$ENDIF}

{$IFNDEF DEBUG}
     Writeln('Debug is off.'); // this code executes
{$ENDIF}

Základně existuje několik standardně přidávaných direktiv:

  • VER140 — verze vašeho Object Pascal compiler, číslo závisí na jeho verzi
  • MSWINDOWS resp. LINUX — záleží na tom, zda pracujete pro Delphi ve Windows® či Kylixu v Linuxu
  • WIN32 — pro získání informace na kolika bitovém operačním systému pracujete. Měla by být dostupná hodnota WIN64, tak jako se ve starých Delphi objevovalo WIN16
  • CPU386 —     pro procesory Intel 386 resp. vyšší x86
  • CONSOLE — pouze v případě, jedná-li se o konsolovou aplikaci.

Mimo to, celý podmínění překlad lze do sebe vnořovat — podle manuálu až do 32 úrovně. Zde ne zcela chápu k čemu to je, osobně jsem vždy vystačil s první úrovní. Maximálně druhou, používal-li jsem UNDEF.

Novinka v Delphi 6

Kompilátor Delphi 6 zavádí novou direktivu $IF, která na rozdíl od direktivy $IFDEF umožňuje ve výrazech vyhodnocovat i konstanty definované v jazyce Delphi resp. Pascal. Pro testování existence předchozí definice určitého symbolu slouží funkce Defined(), existenci deklarace pascalovské konstanty detekuje funkce Declared(), např.

const  MyConst = 'Hi';
     ...
{$IF Defined(WIN32) and Declared(MyConst)}
     ...
{$IFEND}

Z příkladu je názorně vidět, že v této části se může používat booleanovská logika.

Ostatní direktivy

Tuto část shrnu velice rychle a nebudu se u ní moc zastavovat. Existuje množství dalších direktiv, které řídí překlad např. range-checking či I/O checking. Většinu z nich však máte nastavenou přes GUI Delphi v nastavení. Ostatní často není třeba vůbec měnit.

Chcete-li nechat zobrazit jejich aktuální obsah, můžete to udělat opakovaným stiskem Ctrl+O.

Ještě za připomenutí stojí, že některý direktivy jako R, I či L jsou pro připojení dalších zdrojových souborů do projektu. Či existuje jiná (I), která obsluhuje I/O chyby. Ta je mimochodem snad jedna z nejpoužívanějších. Ovšem zajímají-li vás další direktivy více podívejte v nápovědě na kartu Compiler Directives (list).

IFOPT direktiva

Navíc existuje direktiva, která se dokáže odkazovat na jednotlivé switche resp. jejich hodnoty. Takto lze velice jednoduše mít kód, který se opět začlení do binárního souboru pouze v případě, že podmínka v direktivně byla splněna. Typicky to lze ukázat na příkladu

{$IFOPT R+}
     Writeln('range-checking je aktivní')
{$ENDIF}

Je samozřejmé, že se nemusím odkazovat jen na R+, ale na kterýkoliv jiný switch. To se týká i jeho hodnoty, která může být jak +, tak .

Tak a to je vše. Myslím si, že jako ukázka použití je tento článek dostačující. Vlastní praktické použití závisí jen na vás.

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: