微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么{$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决定清理代码库.

原文地址:https://www.jb51.cc/delphi/101562.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐