Delphi中与Free Pascal的FPC define相当的是什么?

5

是否有一个编译器定义可以告诉我们源代码是使用Delphi编译的,类似于Free Pascal中的FPC定义?

我正在开发一个应该与三个Pascal编译器(Lazarus / Free Pascal、Delphi和Winsoft PocketStudio)兼容的单元。这些编译器之间存在一些差异,因此我想提供一些关键部分的编译器特定版本。

对于Free Pascal,我可以编写:

{$IFDEF FPC}
  DoSomething;
{$ENDIF}

但是 Delphi 有什么等价物呢?

3
请参考文档 预定义条件编译。DCC 或许也相关。 - LU RD
1
Delphi没有这个,PocketStudio有吗?如果有的话,你可以使用{$IFNDEF FPC}', '{$IFNDEF POCKET_STUDIO}', '{$ELSE}{$DEFINE DELPHI} - Ken White
1
@KenWhite:Delphi 有一个名为 DCC 的编译器,但只在XE及以后的版本中可用。 - Remy Lebeau
@Remy:我知道,但这个问题没有版本标签。一般情况下也没有 Delphi 的标签。 - Ken White
3个回答

8

在Delphi XE2中,添加了DCC定义到编译器中。在此之前,你必须使用{$IFDEF VERxxx}语句来检查每个版本的Delphi是否存在单独的VERxxx定义,或者使用{$IF DECLARED(CompilerVersion)}语句来为Delphi 6+进行检查。


你确定是XE而不是XE2吗? - Free Consulting
只需知道{$IF}是在D6中引入的,因此如果您需要支持早期版本,则可以使用{$IFDEF CONDITIONALEXPRESSIONS} - Remy Lebeau

2

文档预定义条件编译显示,DCC是一个预定义符号,可用于区分Delphi和其他编译器。


谢谢,我会尝试一下。 - jwdietrich
5
只有在 Delphi XE 及以后版本才能使用 DCC,因为在 XE 之前该工具并不存在。 - Remy Lebeau
谢谢,但这应该是可以解决的。 - jwdietrich
3
它是“可解决的”,只是不太美观,除非PocketStudio有一些可以测试的东西,否则Delphi就是没有检测到其他内容时的备选方案。Indy通过手动为XE之前的每个Delphi版本定义“DCC”来解决这个问题,这样它在需要时总是能够测试“DCC”。 - Remy Lebeau
删除不符合 $if defined() 的版本也极大地简化了包含文件。 - Marco van de Voort

0

谢谢你的提示。

基于它们,我现在可以使用以下语句找出代码是使用 Delphi 还是 Free Pascal 编译:

{$IFDEF VER80}   {Delphi 1}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER90}   {Delphi 2}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER100}   {Delphi 3}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER120}   {Delphi 4}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER130}   {Delphi 5}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER140}   {Delphi 6}
{$DEFINE DELPHI}
{  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER150}   {Delphi 7}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER160}   {Delphi 8}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER170}   {Delphi 9}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER180}   {Delphi 10}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER185}   {Delphi 11 - Spacely}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER190}   {Delphi 11 - Highlander and Delphi 12}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER200}   {Delphi 12}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF VER210}   {Delphi 2010}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF DCC}   {Delphi XE and newer versions}
{$DEFINE DELPHI}
  DoSomeSpecificStuff;
{$ENDIF}

{$IFDEF FPC]   {Lazarus and Free Pascal}
  DoSomeSpecificStuff;
{$ENDIF}

引入$if声明,对于版本>=6的情况可以减少DoSpecificStuff中的冗余部分,与DCC相同。 - Marco van de Voort
你说得没错,但这种表述方式提供了一种向后兼容的形式。旧版的 Pascal 编译器不支持更复杂的 {$IFDEF} 结构。 - jwdietrich

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