10

In XE5 tutte le compilazioni condizionali come

{$IFDEF MSWINDOWS} 

vengono sostituiti con

{$IF defined(MSWINDOWS)} 

Ad esempio System.Diagnostics.pas in XE4 avuto

... 
implementation 

{$IFDEF MSWINDOWS} 
uses Winapi.Windows; 
{$ENDIF} 
{$IFDEF MACOS} 
uses Macapi.Mach; 
{$ENDIF} 

{ TStopwatch } 
... 

ed ora in XE5 sembra che :

... 
implementation 
{$IF defined(MSWINDOWS)} 
uses Winapi.Windows; 
{$ELSEIF defined(MACOS)} 
uses Macapi.Mach; 
{$ELSEIF defined(POSIX)} 
uses Posix.Time; 
{$ENDIF} 

{ TStopwatch } 
... 

C'è qualche ragione particolare per cui dovrei migrare anche le mie invocazioni simili?

+7

Uhm, perché con '$ IFDEF' non è possibile usare' $ ELSEIF'? – TLama

+0

Ho indovinato così ma forse ci sono altri benefici? Il cambiamento è piuttosto massiccio - tutto intorno a tutte le unità. –

+0

Molto difficile vedere oltre la ragione che @TLama ha dato. –

risposta

11

Secondo la documentazione Delphi:

http://docwiki.embarcadero.com/RADStudio/XE6/en/Conditional_compilation_%28Delphi%29

Le direttive condizionali {$ IFDEF}, {$ IFNDEF}, {$ IF}, {$ ELSEIF}, {$ ELSE}, { $ ENDIF} e {$ IFEND} consentono di compilare o sopprimere il codice in base allo stato di un simbolo condizionale.

Il {$IFDEF} e {$IFNDEF} permettono solo di lavorare con definisce precedentemente impostati da {$DEFINE ...}.
Tuttavia la direttiva {$IF ..} è molto più flessibile, perché:

Delphi identificatori non è possibile fare riferimento in qualsiasi direttive condizionali diversi da {$ IF} e {$ ELSEIF}.

const LibVersion = 6; //One constant to define the libversion. 
{$IF LibVersion >= 10.0} 
    do stuff that covers LibVersion 10,11 and 12 
{$ELSEIF Libversion > 5.0} 
    do other stuff that covers LibVersion 6,7,8,9 
{$IFEND} 

se si è tentato di farlo con definisce dovreste fare

{$DEFINE Lib1} 
{$DEFINE Lib2} 
{$DEFINE Lib3} 
{$DEFINE Lib4} 
{$DEFINE Lib5} 
{$DEFINE Lib6} //all previous versions have to be defined. 

{$IFDEF Lib10} 
    do stuff that covers LibVersion 10, 11 and 12 
{$ELSE} 
    {$IFDEF Lib6} 
    do stuff that covers LibVersion 6,7,8,9 
    {$ENDIF} 
{$ENDIF} 

E 'solo una versione leggermente più avanzata di elaborazione dei definisce.
La notazione {$ IF ..} è un po 'più potente e consente di eseguire query sulle espressioni costanti e non solo definisce.

La direttiva {$IF ..} è stato introdotto in Delphi 6.

Credo Embarcadero deciso di ripulire il codice di base.

Problemi correlati