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

时间:2012-01-19 03:35:06

标签: delphi portability conditional-compilation

为了便于举例,我们来检查臭名昭着的TStrings.StrictDelimiter

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

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

2 个答案:

答案 0 :(得分: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这样的工具放置这些文件夹并浏览差异文件,可以快速为您提供一些可以测试的符号....

答案 1 :(得分:1)

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