Delphi назначить на const? - PullRequest
       1

Delphi назначить на const?

3 голосов
/ 02 декабря 2010

этот сайт: http://www.drbob42.com/delphi/wizards.htm

показал очень загадочный код внизу

 unit ShareMem;
 { (c) 1997 by Bob Swart (aka Dr.Bob - http://www.drbob42.com }
 interface

 const
...
 uses
   Windows;

 const
   Handle: THandle = 0;
...
 function GetCommandLine: PChar; stdcall;
   external 'kernel32.dll' name 'GetCommandLineA';
...
   begin
     Handle := LoadLibrary('BCBMM.DLL');
 end.

как это могло быть?

Ответы [ 3 ]

6 голосов
/ 02 декабря 2010

Delphi имеет то, что называется присваиваемыми константами, что позволяет присваивать значения констант.Это может быть включено / выключено через директивы и ключи компилятора.Для более длинного ответа см. здесь .

Иногда бывает полезно, когда свойства класса стали возможными.Даже если const объявлен внутри функции, он сохраняет свое значение между вызовами.

procedure Test;
{$WRITEABLECONST ON}
const
  AssignableConst: Integer = 0;
{$WRITEABLECONST OFF}
begin
  AssignableConst := AssignableConst + 1; 
  WriteLn('Test is called ' + IntToStr(AssignableConst) + ' times'); 
end;
4 голосов
/ 02 декабря 2010

Набранный const по умолчанию (Правка: как заметил Роб в комментариях, это было изменено, чтобы больше не быть по умолчанию много лет назад), больше похоже на статическую переменную. Вы можете отключить это поведение с помощью директивы компилятора .

Это обычно использовалось в качестве замены class / static свойства в старых версиях Delphi. Теперь, когда Delphi действительно имеет эту функцию, нет никаких веских причин делать это ИМХО.

1 голос
/ 02 декабря 2010

Что вам интересно, так это записываемая типизированная константа .Типизированные константы были доступны для записи со старых дней Турбо Паскаля.Фактически это был единственный способ объявить инициализированную переменную .Внутренне записываемые типизированные константы и инициализированные переменные эквивалентны, оба входят в сегмент DATA (так работает пример Lars Truijens ).Кроме того, типизированные константы могут содержать типы данных, которые запрещены для истинных констант, каково их истинное семантическое назначение.С тех пор как Delphi 4 (или даже 3?) Borland понял, что странно смешивать константы и переменные таким образом, он ввел инициализированные глобальные переменные и директиву $WRITEABLECONST (по умолчанию OFF).Инициализированные переменные не могут появляться в локальной области видимости, поэтому все еще существует цель, чтобы существовали записываемые типизированные константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...