【问题标题】:Why doesn't the Delphi compiler warn for a redefined constant?为什么 Delphi 编译器不对重新定义的常量发出警告?
【发布时间】:2013-06-25 08:52:48
【问题描述】:

我的一位同事遇到了一个突然“改变值”的常量;
原来,它被重新声明了:

unit Unit1;

interface

const
   MyConstant = 1;

implementation

end.

--

unit Unit2;

interface

const
   MyConstant = 2;

implementation

end.

--

Uses Unit1, Unit2;
// Uses Unit2, Unit1;

procedure TFrmRedefineConstant.FormShow(Sender: TObject);
begin
   ShowMessage('MyConstant: ' + IntToStr(MyConstant));
end;

这显示2。如果你在 Uses 语句中交换单位顺序,它会显示1

很好,但是为什么 Delphi 编译器不警告重复的常量名(这会很有帮助)?
我可以做些什么来启用警告(看起来不是那样)。

【问题讨论】:

  • 它可以,但它没有,我想你应该在 EMB 论坛上询问为什么这没有引发危险信号......,这同样适用于函数、类等。跨度>
  • 为什么?因为能够在不同的单元中声明具有相同名称的符号/类型并将其放在使用单元的范围内而不是最初声明符号/类型的单元中,这也是一个很好的资产。例如,没有它,Interposer 类是不可能的。
  • @MarjanVenema 是的,但是,有些人宁愿收到有关此案的通知,而不是寻找错误...
  • 很好的例子,说明为什么要将事物保持在尽可能小的范围内。
  • 原来,它被重新声明了。 从技术上讲,它是隐藏的。没有重新声明。有两个不同的声明,其中一个是隐藏的。

标签: delphi constants


【解决方案1】:

因为 Delphi 记录了范围规则。来自语言指南:

单位出现在uses子句中的顺序决定了 它们的初始化顺序并影响标识符的方式 由编译器定位。如果两个单元声明一个变量,常量, 具有相同名称的类型、过程或函数,编译器使用 使用子句中最后列出的单位之一。 (要访问 来自另一个单元的标识符,您必须添加一个限定符: UnitName.Identifier.)

这是自引入单位的 Turbo Pascal 4.0 以来的预期行为。

【讨论】:

  • 因为它是自 1987 年以来记录的预期行为。为什么要警告预期和记录的行为?当局部变量隐藏外部作用域时,它应该发出警告吗?或者一个类方法隐藏了一个过程或函数?您会收到很多警告,它们将毫无用处。在 Delphi 中,单元声明顺序 并非 无关紧要。开发商必须以正确的顺序列出单位。有时人们应该阅读有关他们使用的语言的官方文档。 Google 或 StackOverflow 不是。
  • 几乎所有编译器警告确实会警告预期和记录的行为。可以控制、打开和关闭编译器警告。使用单元的全局效应和对名称空间的影响是 Delphi 的一个巨大弱点。警告将是有价值的。但这无关紧要。该问题提出了一个您根本没有解决的问题。问题是“为什么”?
  • 好吧,TForm.Close 不会隐藏System.Close。这是TForm 的方法中隐含的with Self 或执行此操作的派生类。如果警告所有潜在的隐藏,警告会很吵。但更好的是警告实际隐藏。因此,您必须通过这种方法调用 Close 才能看到警告。但无论如何,你似乎不愿意回答这个问题。为什么编译器设计者选择不包含这样的警告。请在您的答案中引用。
  • 您自己回复了。所有这些警告都会很吵。
  • 这就像问警察为什么不把我拉过来警告我我的车是蓝色的:这不是警告。 “Delphi 编译器不会发出警告,因为没有什么可警告的”。这就是问题的答案。
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多