【问题标题】:Constant with same name in different Unit in DelphiDelphi中不同单元中具有相同名称的常量
【发布时间】:2014-07-23 09:28:50
【问题描述】:

我正在使用 Delphi 6。我创建了一个项目并在其中添加了两个单元 Unit1Unit2
我有一个名为 XML_DIAGRAM='Diagram_Data' 的常量作为 XML 节点的常量,我还声明了Unit2 单元中的相同常量但具有不同的值“Diagram_Name”,我在主单元中使用这两个单元。 我的问题是,当我访问常量 XML_DIAGRAM 时,它总是包含来自单元 Unit2 的常量值。
如果在多个单元中声明了同名常量,那么当用户提出请求时,Delphi 如何决定从哪个单元获取常量?

我的代码:

unit Unit1;   
const
DIAGRAM = 'Diagram_Data';   
end.


 unit Unit2;         
 const
 DIAGRAM = 'Diagram_Name';       
 end.


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Unit1,Unit2;

【问题讨论】:

  • 我对 Delphi 了解不多(并且忘记了我的大部分 Pascal 知识),但是您不能在名称前加上单位名称吗?喜欢Unit1.DIAGRAMUnit2.DIAGRAMThis tutorial about scoping 似乎无论如何都表明了这一点。
  • 我不能确定为什么 Unit2 优先,但可能是因为它是由 IDE 在 Unit1 之后加载的,所以 Unit2 的声明取代了 Unit1 的声明。无论如何,这是一个糟糕的约定,在共享单元中复制一个常量的名称。为什么不称它们为 XML_DIAGRAM_NAME 和 XML_DIAGRAM_DATA?
  • @Rahul - 它决定为documented
  • @Rahul:这是典型的 Pascal:“稍后”声明将隐藏“早期”声明。这不是错误,这是设计的。要访问“早期”声明,只需使用单元名称对其进行限定,例如 J__ 建议:Unit1.DIAGRAM。但我也同意他的观点,你应该使用不同的名字。
  • @RudyVelthuis Pascal 没有单位,当你有单位时,你只能有多个同名的声明。在 Pascal 中,不能有多个同名的声明。也许你在谈论 Pascal 的一些变体。

标签: delphi


【解决方案1】:

如果同名常量在多个单元中声明,那么当用户提出请求时,Delphi 如何决定从哪个单元中获取常量?

documentation 解释了如何处理这种情况:

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

因此,在问题的场景中,DIAGRAM 指的是Unit2 中定义的符号。这是因为uses 子句按Unit1, Unit2 的顺序列出了单位,而Unit2 排在最后。如果你把uses子句中的顺序颠倒过来,Unit2, Unit1,那么DIAGRAM指的是Unit1中定义的符号。

该文档还展示了如何使用完全限定名称来明确您想要的符号。你可以写Unit1.DIAGRAMUnit2.DIAGRAM

最后要说明的是,在不同的单位中使用相同的名称会造成混淆。建议您找到一种编写代码的方法来避免这种情况。

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多