【问题标题】:delphi XE multi-unit namespace questiondelphi XE多单元命名空间问题
【发布时间】:2011-08-25 21:25:33
【问题描述】:

我正在阅读 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. 

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

【问题讨论】:

  • 如果你 uses SysUtils, Lib in Project1 并在Lib.B 中执行TestValue: Integer = 20 然后在Project1 中执行WriteLn(TestValue) 会发生什么?
  • 我想 Codegear 有一些不规则的计划,在 Delphi for Win32 上扩展 .Net 命名空间概念,这些计划从未实施过。 Delphi 中哪里没有多单元命名空间,很难说上面的文档是关于什么的。

标签: delphi namespaces delphi-xe


【解决方案1】:

您的代码与文档不匹配。文档明确指出“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)的新功能。
  • 只是验证:您使用的是 Delphi XE?问是因为通常文档落后于功能而不是相反?从你对安德烈亚斯的回答,我看到你做到了。有趣。
  • 这个“多单元命名空间”功能是什么时候引入的? Delphi 2009 中似乎没有,所以它必须是 2010 或 XE。 (尽管在 2009 年有 Generics.Collections 等单位)
  • 也许你需要一些编译器开关来使用命名空间?我似乎记得在与命名空间相关的编译器选项中某处有一个设置。
  • 如果您在项目选项中明确定义 'Lib' 作为默认命名空间,它将编译。
【解决方案2】:

在 Delphi.NET 中(在 Prism 之前):单元名称 = 命名空间。这就是他们当时使用它的方式——在 dotNET 中,一个单元实际上是一个命名空间(包括在生成的 IL 中的显示)。

在原生 Delphi 中,我看不出有什么区别(如果有的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 2019-03-16
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多