依赖于版本的编译 - $ ENDIF和$ IFEND

时间:2016-06-27 11:03:22

标签: delphi

我似乎陷入困境22。我想添加编译器版本相关的代码。好的 - 这是非常标准的。但是$ IF语句的语法在版本之间是不同的。

这是我想要实现的目标

{$IF CompilerVersion = 28}
  if (fPendingObject = pObject) and (Addr(fPendingActionEvent) = Addr(pPendingActionEvent) ) then
{$ELSE}
  if (fPendingObject = pObject) and (@fPendingActionEvent = @pPendingActionEvent ) then
{$ENDIF}

这在Delphi XE7中编译,但在西雅图或柏林不编译。那些编译器需要语法

{$IF CompilerVersion = 28}
  if (fPendingObject = pObject) and (Addr(fPendingActionEvent) = Addr(pPendingActionEvent) ) then
{$ELSE}
  if (fPendingObject = pObject) and (@fPendingActionEvent = @pPendingActionEvent ) then
{$IFEND}  

($ IFEND而不是$ ENDIF)。但是XE7不接受这种语法。

显然必须有一个技巧,and indeed the Delphi 2009 documentation says so,但我的可怜的大脑无法解决问题。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

有一个编译器选项允许使用旧的{$IFEND}指令:

  • 项目
    • 选项
      • 德尔福选项
      • 编译
        • 要求$ IF由$ IFEND终止:[x] true

然后是{$LEGACYIFEND ON|OFF}指令,它在本地执行相同的操作。将其设置为将使XE7接受{$IFEND},就像旧版本一样。我经常使用类似的东西:

// For Delphi XE3 and up:
{$IF CompilerVersion >= 24.0 }
  {$LEGACYIFEND ON}
{$IFEND}

显然,此选项在您的西雅图或柏林项目中默认启用,但在XE7中不启用。您可以根据自己的喜好将其关闭或打开。