如何创建一个函数/过程的别名?

11

在 Delphi 中,是否有一种声明过程为另一个过程的别名的方法?类似于:

function AnAliasToUpperCase(const S: AnsiString): AnsiString = system.AnsiStrings.UpperCase;  

在程序后面调用 AnAliasToUpperCaseUpperCase 必须完全相同。


7
如果你能学会如何提出合适的问题,就可以为自己和他人省去很多麻烦。表明你真正的问题是什么,你尝试解决它的方法以及解决方案存在的问题。 - Dalija Prasnikar
2个回答

32

比如将其定义为常量声明:

const
  AliasToUpperCase: function(const S: AnsiString): AnsiString = System.AnsiStrings.UpperCase;

可能适合您的需求。


4
整洁。可以很好地用于C头文件翻译。下次一定要考虑到这一点。 - Rudy Velthuis
1
const 可能很好,但在后台它有一些影响,因为我认为它与 VAR AliasToUpperCase: function(const S: AnsiString): AnsiString 相同,而且我知道 var 会有一些性能损失(可能是因为编译器必须在每次调用时添加 try finally)。 - zeus
1
@loki 你是对的:它只是一个伪装成函数指针变量的东西,因此同样会有性能损失。不过这仍然是一个很棒的想法,Victoria。 - dummzeuch
1
@loki 没有添加try finally。调用AliasToUpperCase只会生成一个call dword ptr [<addr of the const>] - Stefan Glienke
@stefan:所以我需要调查,因为我注意到调用变量过程的速度比调用原始过程稍慢。但也许是我的计时器出了问题… - zeus
显示剩余3条评论

6

对于“如何创建函数/过程别名”的问题,正确的答案是“你无法这样做”。

但是有两种模拟方法可以实现这一点,但都可能会引入一些开销-第一种是使用const,如其他答案所示。

除了将其声明为const之外,您还可以将其声明为新的内联例程:

function AliasToUpperCase(const S: AnsiString): AnsiString; inline;
begin
  Result := System.AnsiStrings.UpperCase(S);
end;

但是,您需要依赖于编译器设置来进行内联,并且还需要在调用 AliasToUpperCase 的任何位置添加 AnsiStrings 单元,否则您将收到 H2443 内联函数未扩展,因为单元未在 USES 列表中指定 警告。

对于此函数签名,它可以工作,但对于其他返回类型,您可能会遭受缺少返回值优化和额外值复制的影响。


似乎在10.2 Tokyo中修复了缺失的RVO优化,至少对于托管类型是这样。https://quality.embarcadero.com/browse/RSP-16361。好的,现在我明白了,他们可能搞砸了什么:https://dev59.com/cKfja4cB1Zd3GeqPqRc7#47532570。 - LU RD
不,不是这样的。那个问题的标题是错误的,方法指针不是托管类型。在猜测之前,请自行尝试。创建一个带有字符串字段的记录,并从2个嵌套的函数调用中返回它(类似于AliasToUpperCase函数并查看双重CopyRecord调用)。 - Stefan Glienke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接