2013-06-25 40 views
9

我的一位同事撞上了一个突然“变价”的常数;
横空出世,它被重新声明:为什么Delphi编译器不会警告重定义的常量?

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

它可能但它没有,我想你应该在EMB论坛上询问为什么这不会引发红旗......,这同样适用于函数,类等。 – ComputerSaysNo

+1

为什么?因为它也可以是一个很好的资产,能够在不同的单元中声明一个具有相同名称的符号/类型,并且比使用最初声明符号/类型的单元更接近使用单元的范围。例如,插入器类将不可能没有它。 –

+0

@MarjanVenema真的,但是,有些人宁愿被告知这种情况,而不是寻找错误... – ComputerSaysNo

回答

6

由于Delphi记录的范围规则。从语言指南:

在哪个单位出现在使用子句中的顺序决定了 为了自己的初始化和影响方式标识符 位于编译器。如果两个单元使用相同的名称声明变量,常量,类型,过程或函数,编译器将使用来自uses子句中最后一个列出单元的 。 (要访问其他单元的 标识,你就必须添加一个限定词: UnitName.Identifier)

这是自从Turbo Pascal的4.0,它引入了单位的预期行为。

+0

是的,但*为什么Delphi编译器警告?*是问题。 –

+2

因为这是自1987年以来有记录的预期行为。为什么它应该警告预期和记录的行为?它应该警告当一个局部变量隐藏外部的勺子?或者一个类方法隐藏一个过程或函数?你会得到如此多的警告,他们将是无用的。在Delphi中,单元声明顺序**不是**不相关的。开发者必须按正确的顺序列出单元。 有时候,人们应该阅读他们使用的语言的官方文档。谷歌或StackOverflow不是。 –

+1

几乎所有的编译器警告的确会警告预期和记录的行为。编译器警告可以被控制,打开和关闭。使用一个单位的全球影响和对名字空间的影响是德尔福的一个巨大弱点。警告将是有价值的。但那不是重点。这个问题提出了一个你根本没有解决的问题。问题是“为什么”? –

相关问题