10

W XE5 wszystkie kompilacje warunkowe takie jak

{$IFDEF MSWINDOWS} 

są zastępowane

{$IF defined(MSWINDOWS)} 

Na przykład System.Diagnostics.pas w XE4 miał

... 
implementation 

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

{ TStopwatch } 
... 

a teraz w XE5 wygląda :

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

{ TStopwatch } 
... 

Czy jest jakiś szczególny powód, dla którego powinienem również migrować moje podobne inwokacje?

+7

Uhm, ponieważ z '$ IFDEF' nie można użyć' $ ELSEIF'? – TLama

+0

Zgadłem też, ale może są jakieś inne korzyści? Zmiana jest dość masywna - wszystko wokół wszystkich jednostek. –

+0

Bardzo trudno jest dostrzec przyczynę, którą podał @TLama. –

Odpowiedz

11

Zgodnie z dokumentacją Delphi:

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

Dyrektywy warunkowe {$ IFDEF}, {$ IFNDEF}, {$ IF}, {$ ElseIf}, {$ else}, { $ ENDIF} i {$ IFEND} pozwalają na kompilację lub wyłączenie kodu na podstawie statusu warunkowego symbolu.

{$IFDEF} i {$IFNDEF} tylko pozwalają pracować także wyznacza uprzednio ustalonych przez {$DEFINE ...}.
Jednakże dyrektywa {$IF ..} jest znacznie bardziej elastyczna, ponieważ:

identyfikatory Delphi nie można odwoływać się w żadnych dyrektyw warunkowych innych niż {$ if} i {$} 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} 

Jeśli próbowali zrobić z definiuje trzeba by zrobić

{$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} 

To tylko nieco bardziej zaawansowaną wersją przetwarzanie definiuje.
Notacja {$ IF ..} jest nieco mocniejsza i pozwala na zapytanie o wyrażenia stałe, a nie tylko definiuje.

Dyrektywa {$IF ..} został wprowadzony w Delphi 6.

Chyba Embarcadero postanowił oczyścić bazę kodu.

Powiązane problemy