【问题标题】:How can i detect specific RTL features at compile time?如何在编译时检测特定的 RTL 功能?
【发布时间】:2012-02-13 19:07:09
【问题描述】:

举个例子,让我们检查一下臭名昭著的TStrings.StrictDelimiter

{$IF Declared(TStrings.StrictDelimiter)}
{$MESSAGE WARN 'Beware of TStrings.StrictDelimiter which is False by default!'}
{$IFEND}

但是,Declared 编译器内在在条件行上报告语法错误:E2029 ')' expected but '.' found。 (在 XE 上测试)

【问题讨论】:

  • {$IF declared()} 不支持此功能,但有一个QC 可以投票。

标签: delphi portability conditional-compilation


【解决方案1】:

不幸的是,不支持这种表达式,您必须知道在哪个 RTL / 编译器版本中引入了某些功能,然后使用 predefined conditional symbolsVER<nnn>RTLVersionCompilerVersion 等。

【讨论】:

【解决方案2】:

对于 Delphi XE2,我正在使用这个:

{$IFDEF BDS9}
  Result.VersionString := 'Delphi XE2 ' +
  {$IF NOT DECLARED(Consts.SStyleFeatureNotSupported)}
    '(original release version)'
  {$ELSE} {$IF NOT DECLARED(FireMonkeyVersion)} // D2010 chokes when scope (FMX.Types) is mentioned!
    'Update 1'
  {$ELSE} {$IF NOT DECLARED(System.TestSSE)}
    'Update 2'
  {$ELSE}
    'Update 3'
    // TODO : Update this for any following update!
  {$IFEND} {$IFEND} {$IFEND}
  ;
{$ELSE}
  {$IFDEF BDS7}
     Result.VersionString := 'Delphi 2010';
  {$ELSE}
    {$MESSAGE ERROR 'Extend this!'}
  {$ENDIF}
{$ENDIF}

换句话说:我测试是否存在自任何特定的 delphi 版本以来引入的符号。相同的构造可用于设置变量或常量或编译器定义,因此进一步的代码可以使用它们。

注意:我在Source 文件夹周围保留了过去几年安装的所有Delphi 版本的备份。通过 BeyondCompare 之类的工具放置这些文件夹并浏览差异文件,将很快为您提供一些可以测试的符号......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多