是否在Delphi中定义调用过程之前计算参数的顺序?
IOW,如果我有这个丑陋的代码(在遗留应用程序中找到类似的东西)......
function A(var err: integer): integer;
begin
err := 42;
Result := 17;
end;
Test(A(err), err);
...测试保证接收参数(17,42)还是(17,未定义)?
编辑:
尽管David的示例使用32位和64位编译器返回不同的结果,但这(幸运的是)不会影响我的遗留代码,因为Test(A(错误),错误)仅存储地址寄存器中的'err',编译器在调用A(错误)之前或之后是否执行此操作无关紧要。
答案 0 :(得分:12)
未定义Delphi中参数评估的顺序。
作为一个有趣的演示,以下程序具有不同的输出,具体取决于您是否针对32位或64位代码:
program ParameterEvaluationOrder;
{$APPTYPE CONSOLE}
uses
SysUtils;
function SideEffect(A: Integer): Integer;
begin
Writeln(A);
Result := A;
end;
procedure Test(A, B: Integer);
begin
end;
begin
Test(SideEffect(1), SideEffect(2));
Readln;
end.
答案 1 :(得分:5)
<强>编辑:强> 似乎编译器可能违反了帮助中描述的行为:
来自Calling Conventions帮助主题(强调我的):
register和pascal约定从左到右传递参数;也就是说,最左边的参数是评估并首先传递,最右边的参数被评估并最后传递。