Почему {$IFDEF MSWINDOWS} заменяется {$IF defined (MSWINDOWS)} в Delphi XE5?
в XE5 все условные компиляции, такие как
{$IFDEF MSWINDOWS}
заменены
{$IF defined(MSWINDOWS)}
система.Диагностика.pas в XE4 имел
...
implementation
{$IFDEF MSWINDOWS}
uses Winapi.Windows;
{$ENDIF}
{$IFDEF MACOS}
uses Macapi.Mach;
{$ENDIF}
{ TStopwatch }
...
и теперь в XE5 это выглядит так:
...
implementation
{$IF defined(MSWINDOWS)}
uses Winapi.Windows;
{$ELSEIF defined(MACOS)}
uses Macapi.Mach;
{$ELSEIF defined(POSIX)}
uses Posix.Time;
{$ENDIF}
{ TStopwatch }
...
есть ли какая-то особая причина, по которой я должен перенести свои подобные вызовы?
1 ответов
согласно документации Delphi:
http://docwiki.embarcadero.com/RADStudio/XE6/en/Conditional_compilation_%28Delphi%29
условные директивы {$IFDEF}, {$IFNDEF}, {$IF}, {$ELSEIF}, {$ELSE}, {$ENDIF} и {$IFEND} позволяют компилировать или подавлять код на основе состояния условного символа.
на {$IFDEF}
и {$IFNDEF}
позволяет работать только с определениями, заданными ранее {$DEFINE ...}
.
Однако {$IF ..}
директива намного более гибкая, потому что:
идентификаторы Delphi нельзя ссылаться ни в каких условных директивах, кроме {$IF} и {$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}
если вы попытаетесь сделать это с помощью defines, вам придется сделать
{$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}
это просто немного более продвинутая версия обработки определяет.
The {$IF ..} нотация немного более мощная и позволяет запрашивать константу выражения, а не просто определения.
на {$IF ..}
директива была введена в Delphi 6.
Я думаю, Embarcadero решил очистить базу кода.