delphi - 为什么 "The Tomes of Delphi"处的代码无法编译?

标签 delphi compilation

我正在尝试使用 The Tomes of Delphi 中包含的代码中的 TDRecLstTDSplyCm 单位,但我在 TDBasics.pas 中收到编译器错误:

Identifier expected but 'CONST' found

我在TDStrRes.inc中遇到类似的错误:

Same error as above

出了什么问题,如何解决?

The code可从作者处获取。

最佳答案

显然,您使用的 Delphi 版本比 Delphi 6 更新。尽管在 2005 年进行了更新,但该书中的代码最多只能检测到该版本的 Delphi。 TDDefine.inc 根据它检测到的版本定义了许多编译器符号,但是当您使用的版本不是它识别的任何版本时,它就不会定义任何符号。当编译器在 TDBasics.pas 中遇到这样的代码时,这最终会导致问题;

implementation

uses
  {$IFDEF Delphi1}
  WinTypes, WinProcs;
  {$ENDIF}
  {$IFDEF Delphi2Plus}
  Windows;
  {$ENDIF}
  {$IFDEF Kylix1Plus}
  Types, Libc;
  {$ENDIF}

{$IFDEF Delphi1}
{$R TDStrRes.r16}
{$ENDIF}
{$IFDEF Delphi2Plus}
{$R TDStrRes.r32}
{$ENDIF}
{$IFDEF Kylix1Plus}
{$R TDStrRes.r32}
{$ENDIF}

const
  UnitName = 'TDBasics';

由于 Delphi1Delphi2PlusKylix1Plus 均未定义,因此 uses 子句为空。当我们忽略所有编译器指令和非事件代码块时,编译器最终会看到如下代码:

implementation

uses

const
  UnitName = 'TDBasics';

这就是编译器提示需要标识符而不是 const 的原因。

要解决这个问题,您需要教 TDDefine.inc 识别您的 Delphi 版本。不过,更简单的方法可能是忽略所有版本检测代码并对适用于您正在使用的版本的所有符号进行硬编码。只要您从不使用任何早于 Delphi 6 的版本,所有符号都将适用于您的所有版本。

TDDefine.pas中找到以下代码块:

{$IFDEF VER140}
  {$DEFINE Delphi6}
  {$DEFINE Delphi1Plus}
  {$DEFINE Delphi2Plus}
  {$DEFINE Delphi3Plus}
  {$DEFINE Delphi4Plus}
  {$DEFINE Delphi5Plus}
  {$DEFINE Delphi6Plus}
  {$DEFINE HasAssert}
{$ENDIF}

删除第一行和最后一行,以便无条件处理剩余的 $DEFINE 指令。

关于delphi - 为什么 "The Tomes of Delphi"处的代码无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949486/

相关文章:

android - 如何修复 Android Studio 中 Flutter 的 AndroidX 兼容性?

regex - 使用自定义处理替换另一个字符串中出现的字符串

delphi - 使用临时安全凭证通过 Delphi 将文件上传到 Amazon S3

delphi - 在Delphi中使用IVirtualDesktopManager

Java、Maven 依赖项

c - 如果我使用linux库用C编译程序,我可以在windows上使用它吗?

java - Java 中源代码到字节码的编译到底发生在什么地方?

c - 如何从 Delphi 制作的 DLL 导入函数?

windows - Windows 快捷方式是否支持非常长的参数长度?

perl - 如何让 OS X 10.6 将 JSON::XS 编译为 32 位而不是 64 位?