вопрос о пространствах имен delphi XE - PullRequest
11 голосов
/ 15 мая 2011

Я читаю Документацию RAD Studio в Delphi XE.здесь несколько текстов.

[Delphi Reference -> Delphi Language Guide -> Программы и модули -> Использование пространств имен -> Поиск пространств имен -> Пространства имен из нескольких единиц]

Пространства имен нескольких единиц

Несколько единиц могут принадлежать одному пространству имен, если объявления единиц ссылаются на одно и то же пространство имен.Например, можно создать два файла, 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. 

Это не ошибка.Зачем?Я не понимаю.

Ответы [ 2 ]

4 голосов
/ 15 мая 2011

Ваш код не соответствует документации. В документации прямо указано, что имя файла '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.

0 голосов
/ 16 мая 2011

В Delphi.NET (до Prism): имя модуля = пространство имен. Именно так они и использовали его в то время - и в dotNET единица была действительно пространством имен (включительно, как таковое, в сгенерированном IL).

В родном Delphi я не вижу разницы (если она вообще существует).

...