Почему {$ IFDEF MSWINDOWS} заменяется на {$ IF, определенный (MSWINDOWS)} в Delphi XE5? - программирование
Подтвердить что ты не робот

Почему {$ IFDEF MSWINDOWS} заменяется на {$ IF, определенный (MSWINDOWS)} в Delphi XE5?

В XE5 все условные компиляции, такие как

{$IFDEF MSWINDOWS} 

заменяются на

{$IF defined(MSWINDOWS)}

Например, System.Diagnostics.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 }
...

Есть ли какая-то особая причина, по которой я должен перенести мои подобные вызовы?

4b9b3361

Ответ 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}

Если вы попытаетесь сделать это с помощью определений, вам нужно будет сделать

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

Это немного более продвинутая версия обработки определений.
Обозначение {$ IF..} немного более мощное и позволяет запрашивать постоянные выражения, а не только определяет.

Директива {$IF ..} была введена в Delphi 6.

Я думаю, Embarcadero решил очистить базу кода.