-
Вот такой код:
type TProc = reference to procedure;
procedure CallProc(Proc: TProc); begin Proc; end;
procedure TForm1.Button1Click(Sender: TObject); var S1, S2, S3: String;
begin S1 := 'S1'; S2 := 'S2'; S3 := 'S3';
CallProc(procedure begin S2 := S1; end);
ShowMessage('S1 = ' + S1 + ', S2 = ' + S2 + ', S3 = ' + S3);
end;
Работает всё правильно. Но если я войду в функцию отладчиком, то в окне Watches для S1 и S2 будет написано Undeclared identifier!
-
А если оптимизацию выключить?
-
Выключена
-
Тогда фича дебагера. И поделом. (кстати, а как вы попадаете в функцию? не нашел места в коде, похожего на её вызов)
-
Button1Click - попадание нажатием на кнопку с выставлением брейкпоинта.
-
Ёлы-палы, я думал речь про этот кусочек: CallProc(procedure
begin
S2 := S1;
end);
-
> для S1 и S2 будет написано Undeclared identifier!
- естеcтвенно, т.к. - в лучшем случае - в этом месте существуют только сылочные поля неявно созданного функтора. В худшем - undefined behavior...
-
> KSergey © (21.03.16 15:51) [5]
Так тут же и вызываем.
> естеcтвенно,
Не внутри CallProc, а внутри Button1Click же! Где всё ясно и понятно. При этом S3, который не упомянут в анонимной процедуре - нормально распознаётся отладчиком.
|