プロシージャ/関数内で、現在のプロシージャ/関数の名前を文字列として取得することは可能ですか? コンパイル時に展開される「マクロ」があると思います。
私のシナリオは次のとおりです。レコードが与えられた多くの手順があり、それらはすべてレコードの有効性をチェックすることから始める必要があるため、レコードを「バリデータ手順」に渡します。バリデータ プロシージャ (すべてのプロシージャで同じもの) は、レコードが無効な場合に例外を発生させ、例外のメッセージにバリデータ プロシージャの名前ではなく、バリデータを呼び出した関数/プロシージャの名前を含めたい手順(当然)。
つまり、私は持っています
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;