2011-05-15 63 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)。

在本地德爾福,我看不出差別(如果存在的話)。