【问题标题】:Why {$IFDEF MSWINDOWS} is replaced with {$IF defined(MSWINDOWS)} in Delphi XE5?为什么在 Delphi XE5 中将 {$IFDEF MSWINDOWS} 替换为 {$IF defined(MSWINDOWS)}?
【发布时间】:2014-06-29 03:18:23
【问题描述】:

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

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

【问题讨论】:

  • 嗯,因为$IFDEF 不能使用$ELSEIF
  • 我也猜到了,但也许还有其他好处?变化是相当大的 - 遍及所有单位。
  • 很难看出@TLama 给出的原因。
  • $IF 接受表达式作为参数,而 IFDEF 只是符号名称,因此如果您的项目具有丰富的条件编译,则不再需要使用难看的嵌套条件块。我会说他们只是扔掉过时的指令,就像我们多年前引入 $IF 指令时所做的那样。
  • $IF Defined(SYM) 只是在语法上更高级的 $IFDEF SYM 等价物。除非您对 $IF 有更复杂的表达式或对使用 $ELSEIF 进行分支的特定要求,否则没有理由。

标签: delphi conditional-statements delphi-xe5 conditional-compilation defined


【解决方案1】:

根据 Delphi 文档:

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

条件指令 {$IFDEF}、{$IFNDEF}、{$IF}、{$ELSEIF}、{$ELSE}、{$ENDIF} 和 {$IFEND} 允许您编译或禁止基于条件符号的状态。

{$IFDEF}{$IFNDEF} 只允许您使用以前由 {$DEFINE ...} 设置的定义。
但是{$IF ..} 指令更加灵活,因为:

除 {$IF} 和 {$ELSEIF} 之外的任何条件指令都不能引用 Delphi 标识符。

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 决定清理代码库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2017-01-10
    相关资源
    最近更新 更多