我在过程中有一个变量,在该过程中的匿名方法运行之前,我需要保持该变量不变,但是我没有在匿名方法中使用该变量。是否有一种惯用的方式告诉编译器捕获变量?
例如:
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必须使用一个指针,而不是引用,因此在其中复制不是一个选择。
答案 0 :(得分:0)
我已经在自己的1个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;