9

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

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 编译器不警告重复的常量名(这会很有帮助)?
我可以做些什么来启用警告(看起来不是那样)。

4

1 回答 1

6

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

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

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

于 2013-06-25T12:14:49.870 回答