如何获取Delphi中的当前过程/函数的名称(作为字符串)

在程序/函数内可以获取当前过程/函数名称作为字符串吗?我想在编译时会扩展一些“宏”。

我的方案是这样的:我有很多程序被给予记录,并且他们都需要从检查记录的有效性开始,所以他们将记录传递到“验证程序”。验证器过程(对于所有过程相同)会引发异常,如果记录无效,并且我希望异常的消息不包括验证器过程的名称,而是调用验证器的函数/过程的名称程序(自然)。

就是我有

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;

解决方法

我们正在做类似的事情,只依赖于一个约定:在一开始就放置一个保持函数名的const SMethodName。
然后我们所有的例程都遵循相同的模板,我们在Assert和其他异常提升中使用这个const。
由于const与常规名称的接近,很少有机会错字或任何差异会留在那里很久。
YMMV当然…
procedure SomeProc1(const Struct: TMyStruct);
const
  SMethodName = 'SomeProc1';
begin
  ValidateStruct(Struct,SMethodName);
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
const
  SMethodName = 'SomeProcN';
begin
  ValidateStruct(Struct,SMethodName);
  ...
end;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...