尝试编译此代码会导致IDE终止或编译器无法运行,这是一个错误吗?

时间:2015-06-07 09:30:01

标签: delphi delphi-xe3

谨防内联函数中的Exit命令用法!我一直在这里使用Delphi XE3。

症状

在某些情况下,当调用包含Exit命令的内联函数时,内联函数的返回值直接使用 WriteLn()中,编译器报告错误消息

  

“dcc”退出代码1。

甚至最糟糕的是,Delphi IDE在没有任何确认的情况下终止。

function ProcessNumber(const iNumber: Integer): Boolean; inline;
begin
  if iNumber = 0 then begin
    Result := False;
    Exit;
  end;
  // some code here ...
  Result := True;
end;

procedure Test;
begin
  writeln( ProcessNumber(0) );
end;

begin
  Test;
  ReadLn;
end.

但是,如果内联函数的返回值存储在变量中,然后在WriteLn()中使用该变量,则不会出现问题。

procedure Test;
var
  b: Boolean;
begin
  b := ProcessNumber(0);
  writeln(b);
end;

问题

  1. 这是编译错误吗?
  2. 如果这是一个错误,是否有安全退出内联函数的解决方法?

2 个答案:

答案 0 :(得分:10)

这肯定是个错误。它出现在我测试的所有IDE版本中,XE3,XE7和XE8。老实说,我认为你可以做很多事情。对我来说,IDE每次都会在编译时终止。我认为您只需要以不会导致IDE崩溃的方式编写代码。

您可以使用强制编译的IDE选项来使用msbuild。这会将编译放入一个单独的过程中,从而确保IDE不会崩溃。它不会帮助你很多,因为虽然你的IDE不会一直死,但你仍然无法编译你的程序!

使用msbuild构建时,会出现以下形式的错误:

  

错误F2084:内部错误:GPFC00000FD-004D3F34-0

GPF代表一般保护错误,即内存访问冲突。这可能是一个未处理的异常,在进行编译时会终止IDE。

我的建议是您向Quality Portal提交错误报告。这是修复缺陷的唯一方法。虽然不希望有任何修复来到XE3。

答案 1 :(得分:2)

这里可以使用的一种解决方法是反转if条件实现,从而避免完全使用Exit命令。

所以不要使用

function ProcessNumber(const iNumber: Integer): Boolean; inline;
begin
  if iNumber = 0 then begin
    Result := False;
    Exit;
  end;
  // some code here ...
  Result := True;
end;

使用

function ProcessNumber(const iNumber: Integer): Boolean; inline;
begin
  if iNumber <> 0 then begin
    // some code here
    Result := True;
  end;
  else
    Result := False;
    //No exit needed here as this is already at the end of your method
end;