Delphi: принудительный захват «неиспользуемой» переменной для анонимного метода - PullRequest
0 голосов
/ 04 октября 2018

У меня есть переменная в процедуре, которую нужно поддерживать до тех пор, пока не будет запущен анонимный метод в этой процедуре, но я не использую переменную в анонимном методе.Есть ли идиоматический способ сказать компилятору перехватить переменную в любом случае?

Например:

procedure ForceCapture(const AVar);
begin
  // No-op
end;

procedure TMyClass.MyProcedure;
var
  Rec: TSearchRec;
begin
  CallAnonMethod(@Rec,
    procedure(retVal: Integer);
    begin
      ForceCapture(Rec); // What should this be?
      if retVal = 0 then ...
    end;
end;

Вышеописанное работает на Win32, но я беспокоюсь о том, что бэкэнд LLVM или некоторые другиебудущая оптимизация признает, что ForceCapture ничего не делает, и снимает захват как запрет.В этом случае CallAnonMethod должен принимать указатель, а не ссылку, поэтому создание копии внутри него не вариант.

1 Ответ

0 голосов
/ 04 октября 2018

Я прибегнул к тому, чтобы сделать что-то подобное в одном из моих приложений для Android.(Delphi 10.2.3)

procedure TMyClass.MyProcedure;
var
  Rec: TSearchRec;
begin
  CallAnonMethod(@Rec,
    procedure(retVal: Integer);
    var
      LocalRec: TSearchRec;
    begin
      LocalRec := Rec; // yes, it actually works
      if retVal = 0 then ...
    end;
end;
...