2011-05-15 38 views
11

我读的RAD Studio文件建立在Delphi XE。 这里有一些文字。德尔福XE多单元命名空间的问题

[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的接口符号。

在命名空间中的符号名称必须是唯一的,整个命名空间中的所有单位。
在上面的例子中,它是1单元和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. 

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

+0

如果* only *'在Project1中使用SysUtils,Lib'并在'Lib.B'中执行'TestValue:Integer = 20',然后在'Project1'中执行'WriteLn(TestValue)',会发生什么? – 2011-05-15 15:29:27

+0

我想CodeGear的对延伸的从未被实施了德尔福的命名空间为Win32的净概念,一些不正规的计划。 Delphi中没有多单元命名空间,很难说上面的文档是关于什么的。 – kludg 2011-05-15 17:11:34

回答

4

您的代码不匹配的文档。文件明确规定,“单位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。

+0

我也得到了同样的错误,但我使用德尔福2009年也许这是一个新的XE(或2010)。 – 2011-05-15 15:25:20

+0

我在XE中测试过。 – gabr 2011-05-15 15:28:35

+1

只需验证:你是用Delphi * XE *?因为通常文档是滞后于特征而不是其他方式?从你对安德烈亚斯的回答中,我看到你做到了。有趣。 – 2011-05-15 15:29:40

0

在Delphi.NET(前棱镜):单元名称=命名空间。这就是他们用它在时间的方式 - 在DOTNET的单位是一个真正的命名空间(包括出现在这样产生IL)。

在本地德尔福,我看不出差别(如果存在的话)。