如何在编译时检测特定的RTL功能?

3

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

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

然而,在条件行上,Declared编译器内置函数报告语法错误:E2029“) ”预期但找到“.”。(在XE上测试)


1
此功能不受 {$IF declared()} 支持,但存在一个 QC ,您可以进行投票。 - RRUZ
2个回答

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版本以来的符号是否存在。同样的结构可以用于设置变量、常量或编译器定义,因此进一步的代码可以使用这些内容。

注意:我保留了过去几年中安装的所有Delphi版本的Source文件夹的备份。将这些文件夹通过BeyondCompare等工具进行比较,并浏览差异文件,很快就能给你一些可以测试的符号...


1

很遗憾,这种表达式不受支持,您必须知道某个功能是在哪个RTL /编译器版本中引入的,然后使用预定义条件符号,如VER<nnn>RTLVersionCompilerVersion等。


这引出了另一个问题:是否存在一份RTL/VCL功能列表,可能会影响Delphi编译器线路的可移植性? - OnTheFly
据我所知,没有列表,但是可以在http://docwiki.embarcadero.com/RADStudio/en/Category:Cross-Platform找到一些信息。此外,编译器会发出有关特定于平台的内容的警告(如果您不关闭它,请参见http://docwiki.embarcadero.com/RADStudio/XE2/en/W1002_Symbol_%27%25s%27_is_specific_to_a_platform_%28Delphi%29)。 - ain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接