我的一位同事撞到了一个突然“改变了价值”的常数; 原来,它被重新宣布:
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编译器没有警告重复的常量名称(这会非常有帮助)?
我能做些什么来启用警告(看起来不那么)。
答案 0 :(得分:6)
由于Delphi记录了范围规则。来自语言指南:
单位在uses子句中出现的顺序决定了 它们的初始化顺序并影响标识符的方式 由编译器定位。如果两个单位声明一个变量,常量, 类型,过程或具有相同名称的函数,编译器使用 一个来自使用条款中最后列出的单位。 (访问 来自其他单位的标识符,您必须添加限定符: UnitName.Identifier。)
这是自引入单位的Turbo Pascal 4.0以来的预期行为。