Delphi:强制捕获匿名方法的“未使用”变量

时间:2018-10-03 21:17:00

标签: delphi anonymous-methods

我在过程中有一个变量,在该过程中的匿名方法运行之前,我需要保持该变量不变,但是我没有在匿名方法中使用该变量。是否有一种惯用的方式告诉编译器捕获变量?

例如:

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 :(得分:0)

我已经在自己的1个A​​ndroid应用中采取了类似的措施。 (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;