为什么Delphi编译器没有警告重新定义的常量?

Jan*_*gen 9 delphi constants

我的一位同事撞到了一个突然"改变价值"的常数;
原来,它被重新宣布:

unit Unit1;

interface

const
   MyConstant = 1;

implementation

end.
Run Code Online (Sandbox Code Playgroud)

-

unit Unit2;

interface

const
   MyConstant = 2;

implementation

end.
Run Code Online (Sandbox Code Playgroud)

-

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

procedure TFrmRedefineConstant.FormShow(Sender: TObject);
begin
   ShowMessage('MyConstant: ' + IntToStr(MyConstant));
end;
Run Code Online (Sandbox Code Playgroud)

这表明2.如果您在Uses语句中交换单位订单,则会显示1.

很好,但为什么Delphi编译器没有警告重复的常量名称(这会非常有帮助)?
我能做些什么来启用警告(看起来不那么).

Mad*_*ter 6

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

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

这是Turbo Pascal 4.0引入单位后的预期行为.

  • 因为它是自1987年以来的记录预期行为.为什么它应该警告预期和记录的行为?当一个局部变量隐藏外部scoper时,它是否会发出警告?或者类方法隐藏过程或函数?你会得到这么多的警告他们将毫无用处.在德尔福,单位申报单**不是**无关紧要.开发人员必须按正确顺序列出单位.有时人们应该阅读有关他们使用的语言的官方文档.谷歌或StackOverflow不是. (2认同)
  • 你回应了自己.所有这些警告都会很吵. (2认同)