在程序/函数内可以获取当前过程/函数的名称作为字符串吗?我想在编译时会扩展一些“宏”。
我的方案是这样的:我有很多程序被给予记录,并且他们都需要从检查记录的有效性开始,所以他们将记录传递到“验证程序”。验证器过程(对于所有过程相同)会引发异常,如果记录无效,并且我希望异常的消息不包括验证器过程的名称,而是调用验证器的函数/过程的名称程序(自然)。
就是我有
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当然…
然后我们所有的例程都遵循相同的模板,我们在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;