Есть ли способ изменить локальную типизированную константу из * вне * подпрограммы, в которой она объявлена? - PullRequest
7 голосов
/ 11 марта 2012

Обратите внимание, что это всего лишь мысленный эксперимент.
Я знаю, что глобальные (статические) переменные - это плохо, и нарушение границ - плохая идея в любом случае.

Рассмотрим следующий код:

function IsItChanged: integer;
const
  CanIBeChanged: integer = 0;
begin
  Result:= CanIBeChanged; 
end;

Предполагая, что доступные для записи константы включены, как я могу изменить значение CanIBeChanged вне области функции, в которой оно объявлено?

PS Нет, я не собираюсь когда-либо использовать этот код, это просто вопрос из интереса.

1 Ответ

12 голосов
/ 11 марта 2012

Ну, это может быть сделано только путем утечки указателя на записываемую типизированную константу. Вот пример, который использует довольно запутанный способ напечатать число зверя:

program NaughtyNaughtyVeryNaughty;{$J+}
{$APPTYPE CONSOLE}
procedure Test(out MyPrivatesExposed: PInteger);
const
  I: Integer=665;
begin
  MyPrivatesExposed := @I;
  inc(I);
end;

var
  I: PInteger;
begin
  Test(I);
  Writeln(I^);
  Readln;
end.

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

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