可以在过程/函数内部获取当前过程/函数的名称作为字符串吗?我想可能有一些在编译时展开的“宏”。
我的情况是这样的:我有很多个过程,都需要给定一个记录并检查其有效性,因此它们将记录传递给“验证程序”。 验证程序(对于所有过程来说是相同的)如果记录无效会引发异常,并且我希望异常消息中包含调用验证程序的函数/过程的名称(自然而然的)。
也就是说,我有:
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;