为什么{$IFDEF MSWINDOWS}在Delphi XE5中被{$IF定义(MSWINDOWS)}替换)

在XE5中,所有条件汇编如
{$IFDEF MSWINDOWS}

被替换

{$IF defined(MSWINDOWS)}

例如XE4中的System.Diagnostics.pas

...
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 }
...

有什么特别的原因我应该迁移我的类似的调用吗?

解决方法

根据Delphi文档:

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

The conditional directives {$IFDEF},{$IFNDEF},{$IF},{$ELSEIF},{$ELSE},{$ENDIF},and {$IFEND} allow you to compile or suppress code based on the status of a conditional symbol.

{$IFDEF}和{$IFNDEF}只允许您使用{$DEFINE …}之前设置的定义.
然而,{$IF ..}指令更加灵活,因为:

Delphi identifiers cannot be referenced in any conditional directives other than {$IF} and {$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,9
  {$ENDIF}
{$ENDIF}

这只是一个稍微更高级的处理定义的版本.
{$IF ..}符号更强大,它允许您查询常量表达式,而不仅仅是定义.

{$IF ..}指令在Delphi 6中引入.

我猜Embarcadero决定清理代码库.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...