Delphi var参数的数据类型转换

3

我有一个函数,其参数为var Extended。如果我在调用函数时使用Double类型的参数,编译器会报错。但是,如果我将Extended值作为函数Result返回(并赋给一个Double变量),那么编译器就会通过。

这是预期的吗?如果是,是否有任何方法可以欺骗编译器,以使参数的精度与参数匹配?

function foo1(var e: extended): boolean;
begin
  e := 0.0;
  Result := true;
end;

function foo2(): extended;
begin
  Result := 0.0;
end;

procedure CallFoo();
var
  d: double;
begin
  if foo1(d) then Exit; // compiler complains
  d := foo2; // compiler happy
end;
1个回答

3

var参数要求实际参数完全匹配,只能传递Extended变量。

您可以为每个需要的浮点类型引入重载选项。但是,我的建议是停止使用Extended并切换到DoubleExtended类型仅存在于32位英特尔平台上,并且很少比Double提供任何优势。相反,它不寻常的10字节大小通常会由于不对齐和缓存使用效率低下而导致性能差。


1
@FreeConsulting:我不太明白。你说的“回答的填充部分”是什么? - Rudy Velthuis
1
@Rudy 对于返回值,它会在st(0)中返回,所以这并不重要。在其他情况下,最好使用纯双精度版本隐藏RTL函数。但更重要的是不要将Extended用作变量的数据类型。 - David Heffernan
1
我是在回应你对那份建议不佳的评论。我不认为你知道自己在说什么,也不认为你理解对齐和高效缓存使用的重要性。 - David Heffernan
2
@Free - 您提供的文档引用了以下内容:"如果一个例程的声明指定了 var 参数,则必须传递可分配表达式"。很明显,double 类型可以分配给 extended 类型。在该页面上是否有任何解释有关问题的行为的内容? - Sertac Akyuz
1
@PJH,嗯,我想说另外一种观点——赋值语句(右侧表达式来自函数调用的事实不重要)比通常严格的规则更自由。第一页介绍了:使用var时,您传递了一个同意类型的变量引用,因此该函数直接在那里写入而没有赋值语句固有的任何类型转换魔法。从同一页中可以看到:相反,变量参数的作用类似于指针,而不是副本。 - Free Consulting
显示剩余18条评论

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