我正在努力使Log4D在Delphi XE4中工作,并且得到一些编译错误,因为它在uses子句中找不到Contnrs,除非我将它移动到定义的ifdef之外。
{$IFDEF DELPHI5_UP} Contnrs,{$ENDIF}
有一点调查发现,ifdef是在一个包含的文件Defines.inc中定义的,它对每个“支持”的delphi版本都有一个块,它阻止了几个版本:
例如:
{$IFDEF VER170} { Delphi 2005 } {$DEFINE DELPHI9} {$DEFINE DELPHI4_UP} {$DEFINE DELPHI5_UP} {$DEFINE DELPHI6_UP} {$DEFINE DELPHI7_UP} {$ENDIF} {$IFDEF VER180} { Delphi 2006 } {$DEFINE DELPHI10} {$DEFINE DELPHI4_UP} {$DEFINE DELPHI5_UP} {$DEFINE DELPHI6_UP} {$DEFINE DELPHI7_UP}
因此,尽管如此,您可以轻松地复制并粘贴ifdef for Delphi 2006并创建Delphi XE4块…这似乎是一个不切实际的解决方案。这绝对不是未来的证明…每个新版本你必须去更新这个文件,所以Delphi 4中不存在的一些代码不会使别人的15岁的旧代码爆炸。
所以我想知道是否有更好的方法来进行条件编译,这样才能真正确定在编译该行时是否具有“Delphi 5或更高版本”,而不是需要更新每个出现的每个新版本的delphi的格式。
解决方法
IIRC,Delphi 6引入了条件表达式,这实际上是TLama建议的。要使您的代码使用下面的Delphi版本,您必须检查{$ IFDEF CONDITIONALEXPRESSIONS}。如果未定义,则必须使用旧的VERxxx方案来区分Delphi版本。
对于Delphi 6及更高版本,您可以使用内置的常量CompilerVersion和RTLVersion。你使用哪一个取决于你的代码。无论何时使用CompilerVersion的新编译器功能测试。对于与RTLVersion的RTL或VCL测试相关的任何内容。
对最新的编译器进行编码总是一个好主意,只能使用条件部分来兼容旧版本。所以代替编写{$ IF CompilerVersion> = 26.0}而不是以{$ IF CompilerVersion< 26.0}。因此,在将来,放弃对旧版本编译器的支持要容易得多。