Delphi XE 多单元命名空间问题

11

我正在阅读 Delphi XE 中的 RAD Studio 文档,以下是一些文字。

[ Delphi 参考 -> Delphi 语言指南 -> 程序和单元 -> 使用命名空间 -> 搜索命名空间 -> 多单元命名空间 ]

多单元命名空间

如果单元声明引用了相同的命名空间,则多个单元可以属于同一个命名空间。 例如,可以创建两个文件 unit1.pas 和 unit2.pas,拥有以下单元声明:

// in file 'unit1.pas' 
unit MyCompany.ProjectX.ProgramY.Unit1 

// in file 'unit2.pas' 
unit MyCompany.ProjectX.ProgramY.Unit2 
在这个例子中,命名空间MyCompany.ProjectX.ProgramY逻辑上包含了unit1.pas和unit2.pas中所有的接口符号。
在命名空间中,符号名称必须是唯一的,跨越命名空间中的所有单元。在上面的例子中,如果Unit1和Unit2都定义了一个名为mySymbol的全局接口符号,则会出现错误。
我进行了测试。 下面是代码。
----------------------------------------------------------------- 
program Project1; 

{$APPTYPE CONSOLE} 

uses 
  SysUtils, 
  Lib.A in 'Lib.A.pas', 
  Lib.B in 'Lib.B.pas'; 

begin 
  WriteLn ( TestValue ) ; 
  ReadLn ; 
end. 
----------------------------------------------------------------- 
unit Lib.A; 

interface 
  const TestValue : Integer = 10 ; 
implementation 

end. 
----------------------------------------------------------------- 
unit Lib.B; 

interface 
  const TestValue : Integer = 10 ; 
implementation 

end. 

这不是错误。为什么?我不明白。


如果您在Project1中仅使用SysUtils,Lib,并在Lib.B中执行TestValue:Integer = 20,然后在Project1中执行WriteLn(TestValue),会发生什么? - Andreas Rejbrand
我想Codegear曾经有一些不规则的计划,想要在Delphi for Win32上扩展.Net命名空间的概念,但这些计划从未得以实现。在Delphi中并没有多单元命名空间,很难说上述文档是关于什么的。 - kludg
2个回答

4

您的代码与文档不符。文档明确指出,'unit MyCompany.ProjectX.ProgramY.Unit1' 的文件名应为unit1.pas,而不是MyCompany.ProjectX.ProgramY.Unit1。

然而,我认为这个功能根本没有被实现。如果我将您的代码更改为将第一个单元存储在a.pas文件中,将第二个单元存储在b.pas文件中,则单元根本无法编译,错误信息为

[DCC Error] A.pas(1): E1038 Unit identifier 'Lib.A' does not match file name

(正如我所预期的那样。)

在您的情况下,不存在冲突,因为您始终可以使用“冲突”的全名 - Lib.A.TestValue和Lib.B.TestValue。


我也遇到了同样的错误,但是我使用的是Delphi 2009。可能这对于XE(或2010)是新的。 - Andreas Rejbrand
1
只是确认一下:您正在使用Delphi XE吗?问这个问题是因为通常文档落后于功能,而不是相反的情况。从您对Andreas的回答中,我看到您确实在使用它。有趣。 - Marjan Venema
也许你需要一些编译器开关来使用命名空间?我记得在编译器选项中有一个与命名空间相关的设置。 - Marjan Venema
@Andreas:也许对你们所有人都适用 :-) D2009命名空间选项仅处理默认命名空间,并能够通过指定一个或多个点前缀来缩短使用子句。例如,使用DB代替CodeGear.Vcl.DB,但这似乎很奇怪,因为默认情况下该列表为空,我从未必须编写CodeGear.Vcl.DB... - Marjan Venema
2
如果你在项目选项中明确将“Lib”定义为默认命名空间,它就会编译。 - Kenneth Cochran
显示剩余3条评论

0
在 Delphi.NET(Prism 之前)中:单元名称 = 命名空间。那是他们在那个时候使用的方式 - 在 dotNET 中,一个单元确实是一个命名空间(包括在生成的 IL 中作为这样出现)。
在本地 Delphi 中,我没有看到区别(如果真的存在的话)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接