Можно ли получить имя текущей процедуры/функции в виде строки в процедуре/функции? Я предполагаю, что будет некоторый "макрос", который расширяется во время компиляции.
Мой сценарий таков: у меня есть много процедур, которым дается запись, и все они должны начать с проверки действительности записи, и поэтому они передают запись в "процедуру проверки правильности". Процедура валидатора (то же самое для всех процедур) вызывает исключение, если запись недействительна, и я хочу, чтобы сообщение исключения включало не имя процедуры валидатора, а имя функции/процедуры, которая вызывала валидатор процедура (естественно).
То есть, я
procedure ValidateStruct(const Struct: TMyStruct; const Sender: string);
begin
if <StructIsInvalid> then
raise Exception.Create(Sender + ': Structure is invalid.');
end;
а затем
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProcN');
...
end;
Было бы несколько менее подвержено ошибкам, если бы я вместо этого мог написать что-то вроде
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
а затем каждый раз, когда компилятор встречает {$ PROCNAME}, он просто заменяет "макрос" именем текущей функции/процедуры как строковым литералом.
Обновление
Проблема с первым подходом заключается в том, что он подвержен ошибкам. Например, бывает легко, что вы ошибаетесь из-за копирования-вставки:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
или опечатки:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SoemProc3');
...
end;
или просто временная путаница:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SameProc3');
...
end;