是否可以在过程/函数中以字符串形式获取当前过程/函数的名称?我想会有一些在编译时扩展的“宏”。
我的场景是这样的:我有很多程序都被赋予了记录,它们都需要从检查记录的有效性开始,因此它们将记录传递给“验证程序”。如果记录无效,验证器过程(所有过程都相同)会引发异常,并且我希望异常消息不包括验证器过程的名称,而是调用验证器的函数/过程的名称程序(自然)。
也就是说,我有
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;