OleVariant变量的初始值

Den*_*mov 4 delphi

我一直认为OleVariant变量的初始值总是等于Unassigned(类型VT_EMPTY).但是下面用XE3编译的简单代码告诉我这不是真的.

{$APPTYPE CONSOLE}

uses
  ActiveX;

function GetValue: OleVariant;
begin
  Result := TVariantArg(Result).vt;
end;

function GetValue2: OleVariant;
begin
  Result := 10;
  Result := GetValue;
end;

var
  Msg: string;
begin
  Msg := GetValue2;
  Writeln(Msg);
end.
Run Code Online (Sandbox Code Playgroud)

App写"3".这是正常的吗?

Dav*_*nan 7

对于不适合寄存器的类型,Delphi函数的返回值作为var参数传递.所以编译器将代码转换成如下:

procedure GetValue(var Result: OleVariant);
Run Code Online (Sandbox Code Playgroud)

因此,Result函数入口的值是您为其分配返回值的变量的值.

所以你的调用代码转换为

function GetValue2: OleVariant;
begin
  Result := 10;
  GetValue(Result);
end;
Run Code Online (Sandbox Code Playgroud)

所以整个程序就变成了

{$APPTYPE CONSOLE}

uses
  ActiveX;

procedure GetValue(var Result: OleVariant);
begin
  Result := TVariantArg(Result).vt;
end;

procedure GetValue2(var Result: OleVariant);
begin
  Result := 10;
  GetValue(Result);
end;

var
  tmp: OleVariant;
  Msg: string;
begin
  GetValue2(tmp);
  Msg := tmp;
  Writeln(Msg);
end.
Run Code Online (Sandbox Code Playgroud)

这解释了输出VT_I4.

当然,这完全是实施细节的结果.您应该始终初始化函数返回值.

  • 令人遗憾的是,编译器并不总是将隐式输出参数视为"out"而不是"var". (4认同)