为什么';Delphi编译器是否警告重新定义的常量?

为什么';Delphi编译器是否警告重新定义的常量?,delphi,constants,Delphi,Constants,我的一个同事碰到了一个突然“改变了值”的常数 结果,它被重新宣布: unit Unit1; interface const MyConstant = 1; implementation end. -- -- 这将显示2。如果在Uses语句中交换单位顺序,它将显示1 很好,但是为什么Delphi编译器不警告重复的常量名称(这将非常有用)? 我能做些什么来启用警告(看起来不是这样的)。因为Delphi记录了范围规则。从语言指南: 单位在uses子句中的显示顺序决定了 它们的初始化顺序

我的一个同事碰到了一个突然“改变了值”的常数
结果,它被重新宣布:

unit Unit1;

interface

const
   MyConstant = 1;

implementation

end.
--

--

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

很好,但是为什么Delphi编译器不警告重复的常量名称(这将非常有用)?

我能做些什么来启用警告(看起来不是这样的)。

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

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


这是自推出单元的Turbo Pascal 4.0以来的预期行为。

它可以,但不能,我想你应该在EMB论坛上询问,为什么这不是一个危险信号…,同样适用于函数、类等。为什么?因为能够在不同的单元中声明具有相同名称的符号/类型,并使使用单元的范围比最初声明符号/类型的单元的范围更近,这也是一项巨大的资产。例如,如果没有它,插入器类是不可能的。@Marjannema true,但是,有些人更愿意得到关于这个案例的通知,而不是寻找bug……这是一个很好的例子,说明了为什么要将事情保持在尽可能小的范围内。结果,它被重新声明了。从技术上讲,它是隐藏的。没有重新申报。有两个不同的声明,其中一个是隐藏的,因为这是自1987年以来记录在案的预期行为。为什么要对预期和记录的行为发出警告?当局部变量隐藏外部作用域时,是否应该发出警告?或者类方法隐藏了一个过程或函数?你会收到很多警告,它们都是无用的。在Delphi中,单元声明顺序并非无关。开发商必须按正确的顺序列出单元。有时人们应该阅读有关他们使用的语言的官方文件。Google或StackOverflow并非如此。几乎所有的编译器警告都确实会对预期和记录的行为发出警告。可以控制、打开和关闭编译器警告。使用单元的全局效果以及对名称空间的影响是Delphi的一个巨大弱点。警告是有价值的。但这不是重点。这个问题问了一个你根本没有回答的问题。问题是“为什么”?嗯,
TForm.Close
不会隐藏
System.Close
。它是在
TForm
方法或派生类中使用Self的隐式
。如果警告所有潜在的隐藏,那么警告就会发出噪音。但最好是对真正的藏身行为发出警告。因此,您必须从这样的方法调用
Close
,才能看到警告。但无论如何,你似乎不愿意回答这个问题。为什么编译器设计者选择不包含这样的警告。请在你的答案中加上引文。你自己回答了。所有这些警告都会很吵闹,就像问警察为什么不把我拉到路边警告我的车是蓝色的:这不是警告。“Delphi编译器不会发出警告,因为没有任何警告”。这就是问题的答案。
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;