【问题标题】:Is it good practice to exploit a compiler bug?利用编译器错误是一种好习惯吗?
【发布时间】:2018-07-29 11:31:58
【问题描述】:

最近我发现了一些(对我来说)看起来很奇怪的 Delphi 代码,我将它隔离到一个单独的小项目中。这是我发现的。 Unit1 编译时没有错误。 Unit2(我提供比较)没有。区别在于 Classes 的方式是used

unit Unit1;

interface

uses Classes; // difference here

type TThread = class(Classes.TThread)
public
   property Terminated;
end;

implementation

end.

Unit2 无法编译。产生各种错误。

unit Unit2;

interface

uses System.Classes; // difference here

type TThread = class(Classes.TThread)
public
  property Terminated;
end;

implementation

end.

[dcc32 Error] Unit1.pas(7): E2003 Undeclared identifier: 'Classes'
[dcc32 Error] Unit1.pas(7): E2029 ',' or ':' expected but ')' found
[dcc32 Error] Unit1.pas(9): E2147 Property 'Terminated' does not exist in base class

所以我担心这个项目正在利用编译器错误来实现其目标。编译器错误可能会在以后的版本中修复,然后代码将不再工作。

【问题讨论】:

  • 当然,使用编译器错误是不好的做法。但这不是这里发生的事情。您使用的是什么版本的 Delphi,遇到了什么错误?
  • @Dsm。它是 Delphi 10.0 和 Delphi 10.1(都一样) 我已经编辑了问题以包含 Unit2 的错误消息。 Unit1 和 Unit3 没有错误。
  • 我在这里看不到编译器错误。 Unit2 的代码是错误的,而 Unit1 的代码依赖于单元作用域名称的正确设置。
  • @nolaspeaker:如果uses中包含全限定System.Classes,那么在单元的其余部分也必须这样使用,所以Classes.TThread必须全限定为System.Classes.TThread。 FWIW,我宁愿做这样的事情:TFetchMessageThread = class(TThread)

标签: delphi


【解决方案1】:

如果您使用 System.Classes,则在引用代码中的类单元时也必须使用 System.Classes,如下所示。

unit Unit2;

interface

uses System.Classes; // difference here

type TThread = class(System.Classes.TThread)
public
  property Terminated;
end;

implementation

end.

【讨论】:

  • Uwe 的回答比你早了几秒。
  • 不是真的! Jan 快了大约一分钟。
  • 我认为Uwe的解释是最好的。正确地标记他的最佳答案
【解决方案2】:

没有使 Unit1 编译的编译器错误。它编译是因为在项目设置中 Unit Scope Names 的条目至少包含项 System,它用于解析对全名 中的 Classes 的引用System.Classes。由于 uses 包含 Classes,对 Classes.TThread 的引用也成功。

在 Unit2 中使用包含 System.Classes。因此无法再解析引用 Classes.TThread。将其更改为 System.Classes.TThread 即可。

【讨论】:

  • 谢谢 Uwe。我现在知道了。我从来不知道单位范围名称!
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2019-03-06
  • 2013-03-30
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多