gpt4 book ai didi

Delphi 匿名函数传递给内联函数

转载 作者:行者123 更新时间:2023-12-03 15:57:42 26 4
gpt4 key购买 nike

我偶然发现了一个意想不到的 Delphi 2009 行为。在调查了代码中的一个奇怪错误后,我设法缩小了问题范围并创建了一个最小的示例,如下所示。

当然,下面的代码打印值 1:

program Example1;

{$APPTYPE CONSOLE}

type
TIntFcn = reference to function(const X: integer): integer;

function fcn(AFunction: TIntFcn; a: integer): integer; inline;
begin
result := AFunction(a);
end;

begin

writeln(fcn(function(const X: integer): integer
begin
result := 1;
end, 0));

end.

同样,该程序打印值 2:

program Example2;

{$APPTYPE CONSOLE}

type
TIntFcn = reference to function(const X: integer): integer;

function fcn(AFunction: TIntFcn; a: integer): integer; inline;
begin
result := AFunction(a);
end;

begin

writeln(fcn(function(const X: integer): integer
begin
result := 2;
end, 0));

end.

“显然”,第三个程序打印与第一个程序相同的值,即 1:

program Produce;

{$APPTYPE CONSOLE}

type
TIntFcn = reference to function(const X: integer): integer;

function fcn(AFunction: TIntFcn; a: integer): integer; inline;
begin
result := AFunction(a);
end;

begin

writeln(fcn(function(const X: integer): integer
begin
result := 1;
end, 0));

fcn(function(const X: integer): integer
begin
result := 2;
end, 0); // discard the output

end.

但是,输出不是 1,而是 2。看来编译器在 writeln 中调用 fcn 时使用了第二个匿名函数。

对我来说,这似乎是 Delphi 2009 编译器中的一个错误,但也可能只是我不了解 Delphi 中有关匿名函数的更微妙的细节。你觉得怎么样?

最佳答案

这显然是一个错误,根据对该问题收到的评论,这已在 Delphi XE 中修复。也许最简单的解决方法是如果编译器无法正确处理它,则跳过要求内联:

program Solve;

{$APPTYPE CONSOLE}

type
TIntFcn = reference to function(const X: integer): integer;

function fcn(AFunction: TIntFcn; a: integer): integer;
{$IF CompilerVersion >= 22}inline;{$IFEND} {Warning: Horrible bug in Delphi 2009}
begin
result := AFunction(a);
end;

begin

writeln(fcn(function(const X: integer): integer
begin
result := 1;
end, 0));

fcn(function(const X: integer): integer
begin
result := 2;
end, 0); // discard the output

end.

在大多数情况下,Delphi 2009 中的性能损失应该可以忽略不计,并且您确实在 XE 及更高版本中请求内联。当然,如果您认为内联根本不重要,您可以简单地完全删除该请求。

关于Delphi 匿名函数传递给内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44336596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com