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.
Uhm, ponieważ z '$ IFDEF' nie można użyć' $ ELSEIF'? – TLama
Zgadłem też, ale może są jakieś inne korzyści? Zmiana jest dość masywna - wszystko wokół wszystkich jednostek. –
Bardzo trudno jest dostrzec przyczynę, którą podał @TLama. –